什么是golang中的reflect.Value的零值

时间:2017-03-09 14:14:09

标签: go reflection

在golang reflect包中,reflect.value.IsValid有这些评论:

IsValid报告v是否代表值。如果v为零值,则返回false。如果IsValid返回false,则除String之外的所有其他方法都会发生混乱。大多数函数和方法永远不会返回无效值。如果有,它的文档明确说明了条件。

在上面阅读,我很困惑。我不知道reflect.Value的零值是什么,并使用它调用isValid得到假。

我写了一些代码来测试:

var haha *int
fmt.Println(reflect.ValueOf(haha).IsValid()) //true
var hehe interface{}
fmt.Println(reflect.ValueOf(hehe).IsValid() //false

1 个答案:

答案 0 :(得分:1)

零值是在未提供显式初始化时写入内存地址的默认初始化值。事实上,如果v已初始化v

,则测试v是否为零值

var haha *int返回true,因为哈哈是一个指针,无法使用理性"默认零值"创建,否则它将指向您内存中的随机地址,并可能产生危险的副作用。当指针创建时,指针为零,其他数据类型将具有实际值。

另一方面,var hehe interface{}的零值是一个nil * int,它是一个实际的实体。