Golang小菜-interface的坑

本文探讨了Golang中interface{}

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

Golang小菜-interface的坑

先看题

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var data *byte
	var in interface{}

	fmt.Println(data, data == nil)
	fmt.Println(in, in == nil)

	in = data
	fmt.Println(in, in == nil)
}

小伙伴们先猜猜这段代码的输出是什么吧,我们先分析,再看答案!

第一个Print

首先,第一个Print的输出肯定是 true,因为 data是一个空指针,golang的空指针都为 nil。

第二个Print

我们知道 interface{} 是空接口,它本身也是一种类型,是一个没有方法的 空接口。所以go语言所有的类型都是实现了 空接口 的。

空接口的默认值也是 nil。所以输出 true。

第三个Print

interface{} 的值不是任意类型,而是 interface{} 类型的。

简单翻了下源码,interface的定义应该是下面这两中的一个。

type iface struct {
    tab  *itab
    data unsafe.Pointer
}
type eface struct {
    _type *_type
    data  unsafe.Pointer
}

在执行 in = data 前,in._type 值是 nil, in.data 值是 nil。

执行后,in.type 值是 *uint8(通过反射 reflect.Typeof(in)查看),in.data 值是 nil。

因为 in.type 已经不为 nil了,in 整体不等于 nil。所以输出 false。

interface{} 的为空判断

针对 interface{} 类型是否为空我们不应该去判断 结构体整体为nil ,而是对其值(data)做判断。例如:

func isNil(i interface{}) bool{
	iv := reflect.ValueOf(i)
	return iv.IsNil()
}

我们简单修改代码,再输出结果。

 

个人小站:Lyon`s Home Page

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值