package main
import (
"fmt"
)
type I interface {
M()
}
type T struct {
}
func (t *T) M() {
fmt.Println(t == nil)
}
func main() {
var i I
var t *T
i = t
fmt.Println(i == nil)
i.M()
}
Run Code Online (Sandbox Code Playgroud)
结果是false
和true
。
两种情况下的值都是nil
,类型都是*main.T
。
我明白,第一种情况i == nil
是false
因为变量i
没有类型nil
。
我不明白为什么t == nil
在true
方法里面M()
。
在第一种情况下,i==nil
为 false,因为i
是一个接口,其类型为T
且值为nil
。为了使接口等于文字值nil
,它必须同时具有类型和值nil
。这里,i
有非零类型。
在第二种情况下,接收者只是 nil,因为函数的接收者M
是一个值为 的类型的*T
值nil
。