Go 为什么是;“无”;数字0的值?

Go 为什么是;“无”;数字0的值?,go,Go,字符串的“nil值”对我来说是有意义的,但是0是一个合法的数字。例如,房间中的人数可以是0,但一个人的名字不能是“”。这一惯例背后的理由是什么 (编辑)其他信息: 我想做的是有一种方法来测试是否为一个数字设置了一个值。将某人的姓名设置为“显然是不正确的,而将整数设置为零可能是合法的。在围棋中有没有一种典型的解决这种情况的方法 字符串的“nil值”对我来说是有意义的,但是0是一个合法的数字 你的陈述有两个明显的问题: 字符串不存在“nil”值 “是一个完全合法的字符串 你似乎把Go的“零值”概念和

字符串
的“
nil
值”
对我来说是有意义的,但是
0
是一个合法的数字。例如,房间中的人数可以是
0
,但一个人的名字不能是
“”
。这一惯例背后的理由是什么

(编辑)其他信息:

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

字符串
的“
nil
值”
对我来说是有意义的,但是
0
是一个合法的数字

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

  • 字符串不存在
    nil
    ”值
  • 是一个完全合法的字符串
  • 你似乎把Go的“零值”概念和nil混淆了。这些概念几乎完全无关

    • 字符串的零值为“
    • 数字的零值为
      0
    • 指针或接口的零值为
      nil
      。这是唯一一个
      nil
      和“零值”真正相互关联的地方
    更多的字符串、数字和其他具体类型在Go中永远不能是
    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
    可能是完全有效的值。这意味着这个名字还不知道。