C語言中文網 目錄

Go語言接口的nil判斷

nil 在 Go 語言中只能被賦值給指針和接口。接口在底層的實現有兩個部分:type 和 data。在源碼中,顯式地將 nil 賦值給接口時,接口的 type 和 data 都將為 nil。此時,接口與 nil 值判斷是相等的。但如果將一個帶有類型的 nil 賦值給接口時,只有 data 為 nil,而 type 為 nil,此時,接口與 nil 判斷將不相等。

接口與nil不相等

下面代碼使用 MyImplement() 實現 fmt 包中的 Stringer 接口,這個接口的定義如下:
type Stringer interface {
    String() string
}
在 GetStringer() 函數中將返回這個接口。通過 *MyImplement 指針變量置為 nil 提供 GetStringer 的返回值。在 main() 中,判斷 GetStringer 與 nil 是否相等,代碼如下:
package main

import "fmt"

// 定義一個結構體
type MyImplement struct{}

// 實現fmt.Stringer的String方法
func (m *MyImplement) String() string {

    return "hi"
}

// 在函數中返回fmt.Stringer接口
func GetStringer() fmt.Stringer {

    // 賦nil
    var s *MyImplement = nil

    // 返回變量
    return s
}

func main() {

    // 判斷返回值是否為nil
    if GetStringer() == nil {
        fmt.Println("GetStringer() == nil")
    } else {
        fmt.Println("GetStringer() != nil")
    }

}
代碼說明如下:
  • 第 9 行,實現 fmt.Stringer 的 String() 方法。
  • 第 21 行,s 變量此時被 fmt.Stringer 接口包裝后,實際類型為 *MyImplement,值為 nil 的接口。
  • 第 27 行,使用 GetStringer() 的返回值與 nil 判斷時,雖然接口里的 value 為 nil,但 type 帶有 *MyImplement 信息,使用 == 判斷相等時,依然不為 nil。

發現nil類型值返回時直接返回nil

為了避免這類誤判的問題,可以在函數返回時,發現帶有 nil 的指針時直接返回 nil,代碼如下:
func GetStringer() fmt.Stringer {

    var s *MyImplement = nil

    if s == nil {
        return nil
    }

    return s
}

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo