考虑以下Go程序:
package main
import (
"fmt"
"reflect"
)
func main() {
v := reflect.ValueOf(int(0))
fmt.Printf("IsValid()? %v\n", v.IsValid())
}
鉴于the documentation for Value.IsValid
州:
IsValid报告v是否代表值。 如果v为零值,则返回false。
...并且假设int
的零值为0
,我希望程序报告IsValid()
返回false
。不幸的是,事实并非如此:
IsValid()? true
为什么会这样?
答案 0 :(得分:2)
import "reflect"
Value是Go值的反射界面。
零值表示无值。它的IsValid方法返回false, 它的Kind方法返回Invalid,它的String方法返回"",并且所有其他方法都会出现恐慌。
func ValueOf(i interface{}) Value
ValueOf返回一个初始化为存储的具体值的新Value 在接口i。 ValueOf(nil)返回零值。
func (v Value) IsValid() bool
IsValid报告v是否代表值。如果v是,则返回false 零值。如果IsValid返回false,则除了以外的所有其他方法 串恐慌。大多数函数和方法永远不会返回无效 值。如果有的话,它的文件陈述了条件 明确。
int(0)
是具体的价值。 ValueOf
返回一个新的Value
,初始化为存储在接口i
中的具体值。 ValueOf(nil)
返回零Value
。 IsValid
报告v
是否代表具体值。如果false
为零v
,则会返回Value
。
package main
import (
"fmt"
"reflect"
)
func main() {
fmt.Printf("IsValid(nil) %v\n", reflect.ValueOf(nil).IsValid())
fmt.Printf("IsValid(int(0)) %v\n", reflect.ValueOf(int(0)).IsValid())
}
输出:
IsValid(nil) false
IsValid(int(0)) true
The Go Programming Language Specification
通过声明为变量分配存储空间时 或者通过a来调用new,或者创建新值时 复合文字或make的调用,没有明确的初始化 提供,变量或值被赋予默认值。每个元素 将此类变量或值设置为其类型的零值: 布尔值为假,数字类型为0,""对于字符串,为nil 指针,函数,接口,切片,通道和映射。
import "reflect"
func Zero(typ Type) Value
Zero返回表示指定零值的Value 类型。结果与Value结构的零值不同, 这根本不代表任何价值。例如,零(TypeOf(42)) 返回具有Kind Int和值0的值。返回值为 既不可寻址也不可设定。
Go编程语言零值与reflect
包中的零值不同。注意单词Value和value的大小写的差异。例如,reflect.Zero
返回表示指定类型的零值的Value
。结果与Value
struct
的零值不同,后者根本没有任何值。