go - 为什么 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 的零值int
,0
我希望程序报告IsValid()
返回的false
. 不幸的是,这种情况并非如此:
已验证()?真的
为什么是这样?
解决方案
import "reflect"
Value 是 Go 值的反射接口。
零值表示没有值。它的 IsValid 方法返回 false,它的 Kind 方法返回 Invalid,它的 String 方法返回 "",所有其他方法都恐慌。
func ValueOf(i interface{}) Value
ValueOf 返回一个新值,初始化为存储在接口 i 中的具体值。ValueOf(nil) 返回零值。
func (v Value) IsValid() bool
IsValid 报告 v 是否代表一个值。如果 v 是零值,则返回 false。如果 IsValid 返回 false,则除 String 之外的所有其他方法都会出现恐慌。大多数函数和方法从不返回无效值。如果是这样,它的文档会明确说明条件。
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
当通过声明或 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
,它表示根本没有值。
推荐阅读
- mongodb - MongoDb $graphLookup 在结果中获取根
- python-3.x - 使用通配符字符串汇总分层数据
- angular - Angular - 如何将整个垫脚行移动到表格顶部
- arrays - 在 Google 表格中查询
- r - 如何将 AST 作为 R 中的列表
- jquery - Jquery简单的图像旋转取决于翻转 - 向左或向右 - 如何使这个连续?
- html - 插入内容时更改位置
- ruby-on-rails - 即使验证失败,Active Storage 仍会检测到附件
- html - 自闭合标签、“文档类型”和所见即所得 HTML 编辑器行为
- vba - Outlook 邮件计数宏很慢