interface - 图1

    1. type eface struct { // 16 字节
    2. _type *_type
    3. data unsafe.Pointer
    4. }

    eface 有类型和值,当且仅当 _type 和 data 都为空时,eface 才为 nil
    因此不难理解以下代码的输出为何是 false,因为把 s 当作参数传递时,被隐式转换为了 interface{} 类型,此时 data 不为空。

    1. package main
    2. type TestStruct struct{}
    3. func NilOrNot(v interface{}) bool {
    4. return v == nil
    5. }
    6. func main() {
    7. var s *TestStruct
    8. fmt.Println(s == nil) // #=> true
    9. fmt.Println(NilOrNot(s)) // #=> false
    10. }
    11. $ go run main.go
    12. true
    13. false