golang 声明结构体和声明接口的疑点

本文探讨了在Go语言中,nil值在结构体和接口中的不同行为。通过实例展示了当将未初始化的结构体指针和接口变量传递给函数时,函数内部如何判断这些变量是否为nil。深入解析了接口变量的type和value属性,以及它们如何影响nil判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

type interfaceA interface {
	Num() int
}

type structA struct {
	num int
}

func (s *structA) Num() int {
	return s.num
}

func getData(ia interfaceA) {
	if ia == nil {
		fmt.Println("true")
	} else {
		fmt.Println("false")
	}
}

// 打印结果:true
func TestInitStructIsNil2(t *testing.T) {
	var initStruct *structA
	if initStruct == nil {
		fmt.Println("true")
	} else {
		fmt.Println("false")
	}
}

// 打印结果:false
func TestInitStructIsNil(t *testing.T) {
	var initStruct *structA
	getData(initStruct)
}

// 打印结果:true
func TestInitInterfaceIsNil(t *testing.T) {
	var initInterface interfaceA
	getData(initInterface)
}

结果

声明一个结构体A,此时A等于nil
声明一个结构体A,然后将A作为参数传入另一个函数B,函数B接收到的A不为nil
声明一个接口C,然后将C作为参数传给另一个函数B,函数B接收到的C为nil

通过DEBUG发现,当函数B的参数为接口,而传参为结构体时,参数会判断实现接口的结构体的type。此时函数B获取到的参数不等于nil。
查找资料了解到interface{} 有两个属性,type和value。在上一种情况中,type是有值的,所以不等于nil

在这里插入图片描述

参考博客https://blog.youkuaiyun.com/qq_26981997/article/details/52608081

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值