代码之家  ›  专栏  ›  技术社区  ›  Nathan Osman

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

  •  2
  • Nathan Osman  · 技术社区  · 7 年前

    考虑以下围棋程序:

    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 回复  |  直到 7 年前
        1
  •  2
  •   peterSO    7 年前

    Package reflect

    import "reflect" 
    

    type Value

    value是go值的反射接口。

    零值表示没有值。它的isValid方法返回false, 它的kind方法返回invalid,它的string方法返回“”,所有其他方法都会死机。

    func ValueOf

    func ValueOf(i interface{}) Value
    

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

    func (Value) IsValid

    func (v Value) IsValid() bool
    

    isvalid报告v是否表示值。如果v是 零值。如果isvalid返回false,则除 弦恐慌。大多数函数和方法从不返回无效的 价值。如果有,它的文件会说明 明确地。


    int(0) 是一个具体的价值。 ValueOf 返回新的 Value 初始化为接口中存储的具体值 i . ValueOf(nil) 返回零 价值 . IsValid 报告是否 v 表示具体值。它返回 false 如果 V 是零 价值 .

    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

    当通过声明为变量分配存储时 或者调用new,或者在创建新值时,可以通过 复合文本或make调用,并且没有显式初始化 如果变量或值被赋予默认值。每个元素 变量或值的类型设置为零值: 布尔值为false,数值类型为0,“”字符串为,nil为 指针、函数、接口、切片、通道和映射。


    包反射

    导入“reflect”
    

    func Zero

    func Zero(typ Type) Value
    

    零返回一个值,该值表示指定 类型。结果与value结构的零值不同, 根本不代表什么价值。例如,零(类型(42)) 返回一个类型为int且值为0的值。返回值为 既不可寻址也不可设置。


    go编程语言的零值与 reflect 包裹。注意单词value和value大写的区别。例如, reflect.Zero 返回A 价值 表示指定类型的零值。结果与 价值 struct ,它根本不表示任何值。