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。