關於golang中下劃線(_)的語義說明

葛平發表於2017-05-08

在閱讀k8s程式碼的過程中,經常可以看到下劃線出現在不同的地方,有時候我們並不清楚下劃線代表的具體含義是什麼,有什麼作用,但是又會經常選擇性的忽略這些細節,實際上卻非常重要。
下面我來總結一下下劃線(_)出現的三種場合

用在返回值

這個應該是最簡單的用途,比如某個函式返回三個引數,但是我們只需要其中的兩個,另外一個引數可以忽略,這樣的話程式碼可以這樣寫:

v1, v2, _ := function(...)

用在變數(特別是介面斷言)

例如我們定義了一個介面(interface):

type Foo interface {
     Say()
}

然後定義了一個結構體(struct)

type Dog struct {
}

然後我們希望在程式碼中判斷Dog這個struct是否實現了Foo這個interface

var _ Foo = Dog{}

上面用來判斷Dog是否實現了Foo, 用作型別斷言,如果Dog沒有實現Foo,則會報編譯錯誤

用在import package

假設我們在程式碼的import中這樣引入package:

import _ "test/foo"

這表示呢在執行本段程式碼之前會先呼叫test/foo中的初始化函式(init),這種使用方式僅讓匯入的包做初始化,而不使用包中其他功能
例如我們定義了一個Foo struct,然後對它進行初始化

package foo
import "fmt"
type Foo struct {
        Id   int
        Name string
}
func init() {
        f := &Foo{Id: 123, Name: "abc"}
        fmt.Printf("init foo object: %v
", f)
}

然後在main函式裡面引入test/foo

package main
import (
        "fmt"
        _ "test/foo"
)
func main() {
        fmt.Printf("hello world
")
}

執行結果如下

init foo object: &{123 abc}
hello world

我們可以看到:在main函式輸出”hello world”之前就已經對foo物件進行初始化了!


相關文章