Golang 方法中 nil 接收者的行为

wzz*_*zzz 4 go

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)

结果是falsetrue

两种情况下的值都是nil,类型都是*main.T

我明白,第一种情况i == nilfalse因为变量i没有类型nil

我不明白为什么t == niltrue方法里面M()

Bur*_*dar 9

在第一种情况下,i==nil为 false,因为i是一个接口,其类型为T且值为nil。为了使接口等于文字值nil,它必须同时具有类型和值nil。这里,i有非零类型。

在第二种情况下,接收者只是 nil,因为函数的接收者M是一个值为 的类型的*Tnil