小口啃 Golang - 返回的 nil 不為 nil 的疑惑

前段時(shí)間在寫(xiě)代碼的時(shí)候,遇到一個(gè)奇怪的問(wèn)題,即返回的 nil 值,不為 nil。

導(dǎo)致這個(gè)問(wèn)題的原因是對(duì) Go 中的 nil 理解不全面導(dǎo)致的,直接上測(cè)試代碼如下:

package main

import (
    "fmt"
)

// 定義我們自己的 Error 類(lèi)型
type NilErr struct {
    Code int
    Msg  string
}

// 實(shí)現(xiàn) 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 nil
return of func returnNil is not nil
nil type: *main.NilErr, nil value: <nil>

可以看到,我們聲明了一個(gè) error 變量 err 來(lái)接收函數(shù) returnNil 的返回值,在函數(shù)中我們返回了 nil,但是 err 卻不為 nil,而是一個(gè) type 為 *main.NilErr,值為 nil 的變量,而 Go 中的 nil 是 type value 均為 nil,顯然二者是不相等的。

官方的說(shuō)明 Why is my nil error value not equal to nil?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容