You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言方法nil接收者行为与接口nil判断疑问

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()
}

核心逻辑拆解

  • 首先明确变量默认值:var t *T声明的是*T类型的指针变量,未显式初始化,它的默认值就是nil。
  • Go语言的interface类型底层由两个字段组成:
    • _type:指向存储值的具体类型
    • data:指向存储的具体值
      执行i = t赋值操作时,i的_type字段会被赋值为*main.T,data字段会被赋值为t本身的nil值。此时i == nil返回false,是因为interface只有当_type和data同时为nil时才等于nil,这里_type不为空,所以结果为false,和你已知的逻辑一致。
  • 方法调用的接收者传递规则:调用i.M()时,Go会将interface中存储的data值(也就是那个值为nil的*T指针)作为接收者传递给M()方法。此时方法内部的接收者参数t就是这个nil指针,所以执行t == nil判断时结果自然为true。

额外补充:Go允许值为nil的指针类型接收者调用方法,只要方法内部不访问接收者的成员字段、不调用接收者的其他值方法就不会触发panic,属于Go的合法语法设计。

内容的提问来源于stack exchange,提问作者wzzzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:36:03