Go語言中用來檢測結構體是否實現某個接口的方法(var _)

最近在閱讀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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章