Go 为什么是;“无”;数字0的值?
字符串Go 为什么是;“无”;数字0的值?,go,Go,字符串的“nil值”对我来说是有意义的,但是0是一个合法的数字。例如,房间中的人数可以是0,但一个人的名字不能是“”。这一惯例背后的理由是什么 (编辑)其他信息: 我想做的是有一种方法来测试是否为一个数字设置了一个值。将某人的姓名设置为“显然是不正确的,而将整数设置为零可能是合法的。在围棋中有没有一种典型的解决这种情况的方法 字符串的“nil值”对我来说是有意义的,但是0是一个合法的数字 你的陈述有两个明显的问题: 字符串不存在“nil”值 “是一个完全合法的字符串 你似乎把Go的“零值”概念和
的“nil
值”
对我来说是有意义的,但是0
是一个合法的数字。例如,房间中的人数可以是0
,但一个人的名字不能是“”
。这一惯例背后的理由是什么
(编辑)其他信息:
我想做的是有一种方法来测试是否为一个数字设置了一个值。将某人的姓名设置为“
显然是不正确的,而将整数设置为零可能是合法的。在围棋中有没有一种典型的解决这种情况的方法
字符串的“nil
值”
对我来说是有意义的,但是0
是一个合法的数字
你的陈述有两个明显的问题:
nil
”值“
是一个完全合法的字符串- 字符串的零值为“
”
- 数字的零值为
0
- 指针或接口的零值为
。这是唯一一个nil
和“零值”真正相互关联的地方nil
nil
。(指向这些类型的指针可以是不同的,但这显然是不同的)。因此,谈论“字符串的零值”或“数字的零值”根本没有意义
在您的编辑中,这个问题已经在不同的上下文中得到了回答。有关JSON解组的示例,请参见。不过,简而言之,您必须使用数字/字符串类型以外的其他类型。使用指针或包装类型(如a)。必须从该类型的有效值集中选择指定值。还有什么比这个职位更有资格成为首席执行官
nil
不是数值类型的有效值(例如int
,uint
,int32
等),因此这是不可能的
0
的优点是在二进制表示中它是全零。它的名字也和“零值”一致
可能是-1
<二进制表示法中的code>-1是完整的(使用表示法)<代码>-1不再特殊
那么可能是最小值?如果
字符串的int32
为-1,默认值为”
;对于bool
,默认值为false
;对于int
,默认值为0
您可以使用指针
var num *int
if num == nil {
// num is not set
} else {
// num is set
if *num == 0 {
// num is set to 0
} else {
// num is set to another integer
}
}
同样,您可以判断是否设置了布尔值
在围棋中有没有一种典型的解决这种情况的方法
空字符串或零是有效/无效值取决于应用程序。空名称可能对应用程序无效,但在其他情况下可能有效
在Go中处理此问题的一种方法是创建一个结构,并在其中表示您是否具有该值。例如:
type Person struct {
Name string
HasName bool
Age int
HasAge bool
}
对于这样一个人为的示例,这似乎有点麻烦,但在更复杂的场景中,拥有额外字段的开销是最小的 “
也是合法字符串。在Go中,只有指针和接口值可以为零,因此实际上没有办法将数字设为零。也许您的意思是数字?nil
(或其他语言中的null
/null
)不相同,或者是空字符串或零的替换。它是一个表示没有任何值、未知值或在上下文中无关紧要的值的概念。空字符串是无效的人名,但nil
可能是完全有效的值。这意味着这个名字还不知道。