關於golang中下劃線(_)的語義說明
在閱讀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\n", f)
}
然後在main函數裏麵引入test/foo
package main
import (
"fmt"
_ "test/foo"
)
func main() {
fmt.Printf("hello world\n")
}
運行結果如下
init foo object: &{123 abc}
hello world
我們可以看到:在main函數輸出"hello world"之前就已經對foo對象進行初始化了!
最後更新:2017-05-08 17:01:47