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