go any用法

73 阅读1分钟
**以下程序输出结果是什么?**
func isNull(obj any) bool {
	return obj == nil
}

func testIsNull() {
	var v1 any
	var v3 *int
	
	fmt.Println("v1 is", isNull(v1))
	fmt.Println("v3 is", isNull(v3))
}

结果:

v1 is true
v3 is false

这段代码v3的结果可能让人难以明白,明明传进去的是nil,为什么返回结果是false呢?

这和interface的底层结构有关,any是interface的别名,而interface在没有包含具体方法时,其底层结构包含_type和data两个字段,虽然data为空,但是_type存储的是*int,故此时v3传入到isNull中的obj是非空的。

但是v1是nil,因为v1传到isNull之后,其_type和data两个字段都是nil,故obj为nil。