" nil
"字符串""
的值对我有意义,但0
是合法的数字。例如,一个房间的人数可以是0
,但一个人的姓名不能是""
。这次会议背后的原因是什么?
(编辑)其他信息:
我想要做的是测试是否为数字设置了值。将某人的姓名设置为""
显然不正确,而将整数设置为零可能是合法的。是否有一种典型的方法可以解决这种情况?
答案 0 :(得分:7)
"
nil
"字符串""
的值对我有意义,但0
是合法的数字。
您的陈述有两个明显的问题:
nil
"字符串的值。""
是完全合法的字符串。你好像混淆了Go"零值"的概念。没有。这些概念几乎完全不相关。
""
。0
。nil
。这是唯一nil
和"零值"真的是彼此相关。 Go中的其他字符串,数字和其他具体类型不能nil
。 (这些类型的指针可以是,但这显然是不同的)。所以谈论字符串" nil值"或"数字的值为#34;没有意义。
在回复您的编辑时,此问题已在各种情况下得到解答。有关JSON解组的示例,请参阅here。但简而言之,您必须使用数字/字符串类型以外的其他内容。使用指针或包装类型(例如sql.NullInt64)。
答案 1 :(得分:4)
必须选择该类型的有效值的指定值。还有什么可以使该职位更有资格成为zero-value?
nil
不是数字类型的有效值(例如int
,uint
,int32
等),因此无法解决问题
0
的好处是在二进制表示中它是完整的零。它的名称也符合"零值" 。
也许-1
?二进制表示中的-1
是完整的(使用2's complement表示)。 -1
不再特别。
然后可能是最小值?如果int32
-1 << 31
为-2147483648
。但是如果类型是无符号的,例如uint32
,那将是0
。此外,取int
类型的最小值甚至不是常数,因为它取决于目标体系结构(可能是-1 << 31
和-1 << 63
)。
如果0
是您使用的值,并且您想区分它是否已经设置(或者该值是否只是零值),请使用指针(例如*int
)可能有nil
值(零值),表示尚未设置。
另一种选择是使用第二个变量(可能是bool
类型),它的true
值表示已经设置了数字。
还有更多技巧(选择一个聪明的,未使用的有效值),请查看How do I represent an Optional String in Go?
答案 2 :(得分:1)
对于string
,默认值为""
;对于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
}
}
以同样的方式,您可以判断是否设置了布尔值。
答案 3 :(得分:0)
是否有一种典型的方法可以解决这种情况?
空字符串或零是否为有效/无效值取决于应用程序。空名称可能对您的应用程序无效,但在其他情况下可能有效。
在Go中处理此问题的方法是创建一个结构,并在其中表示您是否具有该值。例如:
type Person struct {
Name string
HasName bool
Age int
HasAge bool
}
对于这样一个人为的例子来说,这似乎有点麻烦,但在更复杂的情况下,额外字段的开销很小。