为什么" nil"数字0的值?

时间:2017-10-11 07:59:53

标签: go

" nil"字符串""的值对我有意义,但0是合法的数字。例如,一个房间的人数可以是0,但一个人的姓名不能是""。这次会议背后的原因是什么?

(编辑)其他信息:

我想要做的是测试是否为数字设置了值。将某人的姓名设置为""显然不正确,而将整数设置为零可能是合法的。是否有一种典型的方法可以解决这种情况?

4 个答案:

答案 0 :(得分:7)

  

" nil"字符串""的值对我有意义,但0是合法的数字。

您的陈述有两个明显的问题:

  1. 没有" nil"字符串的值
  2. ""是完全合法的字符串。
  3. 你好像混淆了Go"零值"的概念。没有。这些概念几乎完全不相关。

    • 字符串的零值为""
    • 数字的零值为0
    • 指针或接口的零值为nil。这是唯一nil和"零值"真的是彼此相关。

    Go中的其他字符串,数字和其他具体类型不能nil。 (这些类型的指针可以是,但这显然是不同的)。所以谈论字符串" nil值"或"数字的值为#34;没有意义。

    在回复您的编辑时,此问题已在各种情况下得到解答。有关JSON解组的示例,请参阅here。但简而言之,您必须使用数字/字符串类型以外的其他内容。使用指针或包装类型(例如sql.NullInt64)。

答案 1 :(得分:4)

必须选择该类型的有效值的指定值。还有什么可以使该职位更有资格成为zero-value

nil不是数字类型的有效值(例如intuintint32等),因此无法解决问题

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
}

对于这样一个人为的例子来说,这似乎有点麻烦,但在更复杂的情况下,额外字段的开销很小。