欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Go語言創(chuàng)建error的幾種方式小結(jié)

 更新時間:2024年01月02日 10:50:43   作者:程序員讀書  
Go語言函數(shù)(或方法)是支持多個返回值的,因此在Go語言的編程哲學(xué)中,函數(shù)的返回值的最后一個通常都是error類型,所以本文給大家介紹了使用Go語言創(chuàng)建error的幾種方式小結(jié),文中通過代碼示例講解的非常詳細,需要的朋友可以參考下

Go語言函數(shù)(或方法)是支持多個返回值的,因此在Go語言的編程哲學(xué)中,函數(shù)的返回值的最后一個通常都是error類型:

//標(biāo)準(zhǔn)os包下的函數(shù)
func Open(name string) (*File, error) {
	return OpenFile(name, O_RDONLY, 0)
}

error類型作為函數(shù)的最后一個返回值,其作用在于告訴調(diào)用者函數(shù)在執(zhí)行過程是否發(fā)生錯誤,當(dāng)返回的error值為nil,表示函數(shù)正常執(zhí)行。

其實,error類型本質(zhì)上是一個Go內(nèi)置的接口,其定義如下:

type error interface {
	Error() string
}

從上面error的定義可以看到error接口只有一個Error()方法。

遵循著Go語言的編程哲學(xué),當(dāng)我們開發(fā)自己的函數(shù)時最好也把error作為函數(shù)的最后一個返回值。

即然要返回error類型,那么就必須先創(chuàng)建error類型,怎么創(chuàng)建呢?在這篇文章我們簡單學(xué)習(xí)三種創(chuàng)建error類型的方式。

使用errors包

Go標(biāo)準(zhǔn)庫errors包為了我們提供了一個最簡單的error接口實現(xiàn):

//errors包errors.go文件
type errorString struct {
	s string
}

func (e *errorString) Error() string {
	return e.s
}

從上面的定義可以看到errorString實現(xiàn)了error接口,且參數(shù)非常簡單,只有一個文本信息,通過errors.New()函數(shù)可以創(chuàng)建一個errorString類型:

package school

import "errors"

type Student struct {
	ID    int
	Name  string
	Score int
}

func NewStudent(id int, name string, score int) (*Student, error) {
	if id <= 0 {
		return nil, errors.New("id could not less than 0")
	}

	if score < 0 || score > 100 {
		return nil, errors.New("score must between 0 and 100")
	}

	return &Student{id, name, score}, nil
}

fmt.Errorf()函數(shù)

有時候我們需要復(fù)雜的錯誤信息,如果直接調(diào)用errors.New()方法的話,需要自己拼接字符串,而標(biāo)準(zhǔn)庫fmt包的Errorf()函數(shù)可以格式化文本并返回一個error類型:

package school

import (
	"fmt"
)

type Student struct {
	ID    int
	Name  string
	Score int
}

func NewStudent(id int, name string, score int) (*Student, error) {
	if id <= 0 {
		return nil, fmt.Errorf("%d is less than 0", id)
	}

	if score < 0 || score > 100 {
		return nil, fmt.Errorf("%d is not between 0 and 100", score)
	}

	return &Student{id, name, score}, nil
}

自己實現(xiàn)error接口

上述的兩種創(chuàng)建error類型方式,本質(zhì)上包內(nèi)部有一個error接口的實現(xiàn),所以如果我們希望返回更詳細的錯誤類型,方便調(diào)用者判斷,可以實現(xiàn)自己的錯誤類型:

package main

import (
	"fmt"
	"net/http"
)

type ResponseError struct {
	code    int
	message string
}

func (r ResponseError) Error() string {
	return fmt.Sprintf(`{"code":%d,"message":"%s"}`, r.code, r.message)
}

func getUser(id string) (map[string]string, error) {
	if len(id) == 0 {
		return nil, &ResponseError{1, "id不能為空"}
	}
	return map[string]string{"id": id, "name": "測試"}, nil
}

func main() {
	http.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) {
		id := r.FormValue("id")
		user, err := getUser(id)

		if err != nil {
			fmt.Fprint(w, err)
			return
		}
		fmt.Fprint(w, user)
	})
	http.ListenAndServe(":80", nil)
}

小結(jié)

error類型是Go語言的內(nèi)置類型,其本質(zhì)是一個只有Error()方法的接口,因此只要實現(xiàn)該方法就可以作為error類型使用。

到此這篇關(guān)于使用Go語言創(chuàng)建error的幾種方式小結(jié)的文章就介紹到這了,更多相關(guān)Go創(chuàng)建error內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang中結(jié)構(gòu)體映射mapstructure庫深入詳解

    Golang中結(jié)構(gòu)體映射mapstructure庫深入詳解

    mapstructure用于將通用的map[string]interface{}解碼到對應(yīng)的 Go 結(jié)構(gòu)體中,或者執(zhí)行相反的操作。很多時候,解析來自多種源頭的數(shù)據(jù)流時,我們一般事先并不知道他們對應(yīng)的具體類型。只有讀取到一些字段之后才能做出判斷
    2023-01-01
  • golang生成RSA公鑰和密鑰的實現(xiàn)方法

    golang生成RSA公鑰和密鑰的實現(xiàn)方法

    本文主要介紹了golang生成RSA公鑰和密鑰的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Go語言通過http抓取網(wǎng)頁的方法

    Go語言通過http抓取網(wǎng)頁的方法

    這篇文章主要介紹了Go語言通過http抓取網(wǎng)頁的方法,實例分析了Go語言通過http操作頁面的技巧,需要的朋友可以參考下
    2015-03-03
  • Go語言計算指定年月天數(shù)的方法

    Go語言計算指定年月天數(shù)的方法

    這篇文章主要介紹了Go語言計算指定年月天數(shù)的方法,實例分析了Go語言操作時間的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go語言中字符串賦值中的問題與解決方法

    Go語言中字符串賦值中的問題與解決方法

    這篇文章主要為大家詳細介紹了Go語言中字符串賦值會出現(xiàn)的一些問題以及解決方法,文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下
    2024-12-12
  • go語言基礎(chǔ) seek光標(biāo)位置os包的使用

    go語言基礎(chǔ) seek光標(biāo)位置os包的使用

    這篇文章主要介紹了go語言基礎(chǔ) seek光標(biāo)位置os包的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 手把手教你導(dǎo)入Go語言第三方庫

    手把手教你導(dǎo)入Go語言第三方庫

    本文主要介紹了手把手教你導(dǎo)入Go語言第三方庫,通過導(dǎo)入gin包來深入學(xué)習(xí),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Go語言中反射的正確使用

    Go語言中反射的正確使用

    Go本身不支持模板,因此在以往需要使用模板的場景下往往就需要使用反射(reflect). 反射使用多了以后會容易上癮,有些人甚至?xí)纬梢环N莫名其妙的鄙視鏈。下面這篇文章就給大家介紹了如何正確使用Go語言中的反射以及在使用前的注意,有需要的朋友們下面來一起看看吧。
    2016-12-12
  • Golang實現(xiàn)深拷貝reflect原理示例探究

    Golang實現(xiàn)深拷貝reflect原理示例探究

    這篇文章主要為大家介紹了Golang實現(xiàn)reflect深拷貝原理示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Golang中文件目錄操作的實現(xiàn)步驟詳解

    Golang中文件目錄操作的實現(xiàn)步驟詳解

    在Golang中,文件目錄是指計算機文件系統(tǒng)中的文件夾或目錄。目錄是用于組織和存儲文件的一種方式,可以包含文件和其他子目錄,本文主要介紹了Golang中文件目錄操作的實現(xiàn)方法,需要的朋友可以參考下
    2023-05-05

最新評論