首页 > 解决方案 > 为什么 IsValid() 对于 int 的零值返回 true?

问题描述

考虑以下 Go 程序:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    v := reflect.ValueOf(int(0))
    fmt.Printf("IsValid()? %v\n", v.IsValid())
}

鉴于国家的文件Value.IsValid

IsValid 报告 v 是否代表一个值。如果 v 是零 Value ,则返回 false

...并且鉴于 is 的零值int0我希望程序报告IsValid()返回的false. 不幸的是,这种情况并非如此:

已验证()?真的

为什么是这样?

标签: goreflection

解决方案


包反映

import "reflect" 

类型值

Value 是 Go 值的反射接口。

零值表示没有值。它的 IsValid 方法返回 false,它的 Kind 方法返回 Invalid,它的 String 方法返回 "",所有其他方法都恐慌。

函数值

func ValueOf(i interface{}) Value

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

func(值)IsValid

func (v Value) IsValid() bool

IsValid 报告 v 是否代表一个值。如果 v 是零值,则返回 false。如果 IsValid 返回 false,则除 String 之外的所有其他方法都会出现恐慌。大多数函数和方法从不返回无效值。如果是这样,它的文档会明确说明条件。


int(0)是一个具体的值。ValueOf返回一个新的Value初始化为存储在接口中的具体值iValueOf(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

Go 编程语言规范

零值

当通过声明或 new 调用为变量分配存储空间时,或者通过复合文字或 make 调用创建新值时,并且未提供显式初始化,则给出变量或值默认值。此类变量或值的每个元素的类型都设置为零值:布尔值为 false,数字类型为 0,字符串为 "",指针、函数、接口、切片、通道和映射为 nil。


包反映

import "reflect" 

功能零

func Zero(typ Type) Value

Zero 返回一个 Value,表示指定类型的零值。结果与 Value 结构的零值不同,它表示根本没有值。例如,Zero(TypeOf(42)) 返回 Kind Int 且值为 0 的 Value。返回的值既不可寻址也不可设置。


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


推荐阅读