最近在閱讀go語言源碼的時候,看到了一種通過var _檢測方法是否被定義的方法,查看了一些資料,總結一下。
1. 案例分析
通過下面的demo還原我遇到的問題。
// Member
type Member struct {
ID
Role
UserName
}
type IMember interface {
}
// 檢測Member是否實現了IMember接口
// 1) _爲了避免變量未使用編譯的時候報錯
// 2)_的類型爲IMember,接口的值爲Member的地址,(nil)表示該地址爲nil。
var _ IMember = (*Member)(nil)
在上面的代碼中出現了var _ ArgName這種定義變量的形式,最後查資料知道這是用來檢測Member是否實現了IMember接口,如果沒有實現該接口則編譯的時候就會報錯,這種定義方式主要用於在源碼編譯的時候。
2. 可以被定義爲 nil 的類型
- 指針類型
- map類型
- 函數類型
- 切片類型
- channel類型
- interface類型
package main
func main() {
_ = (*struct{})(nil)
_ = []int(nil)
_ = map[int]bool(nil)
_ = chan string(nil)
_ = (func())(nil)
_ = interface{}(nil)
// 下面這些行跟上面的等價
var _ *struct{} = nil
var _ []int = nil
var _ map[int]bool = nil
var _ chan string = nil
var _ func() = nil
var _ interface{} = nil
// 下面這行不編譯
var _ = nil
}