golang nil interface 接口接收nil返回值的坑

参考文章:https://www.jianshu.com/p/111312188316

nil interface 和 nil interface 的值。
虽然 interface 看起来像指针类型,但它不是。
interface 类型的变量只有在类型和值均为 nil 时才为 nil

其实接口不是指针,内部存储的有实际imp的类型和val 两个值,本文的bug,返回的是nil (imp的值nil),但是它赋值给的是 接口的值,接口记录了它的实际类型type=*struct{}, val = nil 。

如果你的 interface 变量的值是跟随其他变量变化的,与 nil 比较相等时小心:

func main() {
	doIt := func(arg int) interface{} {
		var result *struct{} = nil
		if arg > 0 {
			result = &struct{}{}
		}
		return result
	}

	res := doIt(-1)
	if res != nil {
		fmt.Println("res is not nil, res = ", res)
	} else {
		fmt.Println("res is nil, res = ", res)
	}

	fmt.Println("Good result: ", res) // Good result:  <nil>
	fmt.Printf("%T\n", res)           // *struct {}   // res 不是 nil,它的值为 nil
	fmt.Printf("%v\n", res)           // <nil>
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值