這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
前段時間在寫代碼的時候,遇到一個奇怪的問題,即返回的 nil 值,不為 nil。
導致這個問題的原因是對 Go 中的 nil 理解不全面導致的,直接上測試代碼如下:
package mainimport ( "fmt")// 定義我們自己的 Error 類型type NilErr struct { Code int Msg string}// 實現 error 介面的 Error 方法func (e *NilErr) Error() string { return fmt.Sprintf("Code:%d, Msg:%s", e.Code, e.Msg)}func returnNil() *NilErr { return nil}func main() { fmt.Println("not nil when return nil") var err error err = returnNil() if err != nil { fmt.Println("return of func returnNil is not nil") fmt.Printf("nil type: %T, nil value: %v", err, err) }}
上面程式的輸出如下:
not nil when return nilreturn of func returnNil is not nilnil type: *main.NilErr, nil value: <nil>
可以看到,我們聲明了一個 error 變數 err 來接收函數 returnNil 的傳回值,在函數中我們返回了 nil,但是 err 卻不為 nil,而是一個 type 為 *main.NilErr,值為 nil 的變數,而 Go 中的 nil 是 type value 均為 nil,顯然二者是不相等的。
官方的說明 Why is my nil error value not equal to nil?