type eface struct { // 16 字节
_type *_type
data unsafe.Pointer
}
eface 有类型和值,当且仅当 _type 和 data 都为空时,eface 才为 nil
因此不难理解以下代码的输出为何是 false,因为把 s 当作参数传递时,被隐式转换为了 interface{} 类型,此时 data 不为空。
package main
type TestStruct struct{}
func NilOrNot(v interface{}) bool {
return v == nil
}
func main() {
var s *TestStruct
fmt.Println(s == nil) // #=> true
fmt.Println(NilOrNot(s)) // #=> false
}
$ go run main.go
true
false