为什么IsValid()为int的零值返回true?

时间:2018-06-16 21:41:30

标签: go reflection

考虑以下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

为什么会这样?

1 个答案:

答案 0 :(得分:2)

  

Package reflect

import "reflect" 
     

type Value

     

Value是Go值的反射界面。

     

零值表示无值。它的IsValid方法返回false,   它的Kind方法返回Invalid,它的String方法返回"",并且所有其他方法都会出现恐慌。

     

func ValueOf

func ValueOf(i interface{}) Value
     

ValueOf返回一个初始化为存储的具体值的新Value   在接口i。 ValueOf(nil)返回零值。

     

func (Value) IsValid

func (v Value) IsValid() bool
     

IsValid报告v是否代表值。如果v是,则返回false   零值。如果IsValid返回false,则除了以外的所有其他方法   串恐慌。大多数函数和方法永远不会返回无效   值。如果有的话,它的文件陈述了条件   明确。

int(0)是具体的价值。 ValueOf返回一个新的Value,初始化为存储在接口i中的具体值。 ValueOf(nil)返回零ValueIsValid报告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

     

The zero value

     

通过声明为变量分配存储空间时   或者通过a来调用new,或者创建新值时   复合文字或make的调用,没有明确的初始化   提供,变量或值被赋予默认值。每个元素   将此类变量或值设置为其类型的零值:   布尔值为假,数字类型为0,""对于字符串,为nil   指针,函数,接口,切片,通道和映射。

  

Package reflect

import "reflect" 
     

func Zero

func Zero(typ Type) Value
     

Zero返回表示指定零值的Value   类型。结果与Value结构的零值不同,   这根本不代表任何价值。例如,零(TypeOf(42))   返回具有Kind Int和值0的值。返回值为   既不可寻址也不可设定。

Go编程语言零值与reflect包中的零值不同。注意单词Value和value的大小写的差异。例如,reflect.Zero返回表示指定类型的零值的Value。结果与Value struct的零值不同,后者根本没有任何值。