在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
答案 0 :(得分:1)
零值是在未提供显式初始化时写入内存地址的默认初始化值。事实上,如果v已初始化v
,则测试v是否为零值 var haha *int
返回true,因为哈哈是一个指针,无法使用理性"默认零值"创建,否则它将指向您内存中的随机地址,并可能产生危险的副作用。当指针创建时,指针为零,其他数据类型将具有实际值。
另一方面,var hehe interface{}
的零值是一个nil * int,它是一个实际的实体。