golang中的nil是什么意思?

新手上路,请多包涵

golang中使用 nil 的情况很多。例如:

 func (u *URL) Parse(ref string) (*URL, error) {
    refurl, err := Parse(ref)
    if err != nil {
        return nil, err
    }
    return u.ResolveReference(refurl), nil
}

但我们不能这样使用它:

 var str string //or var str int
str = nil

golang 编译器将抛出 can't use nil as type string in assignment 错误。

看起来 nil 只能用于结构和接口的指针。如果是这样的话,那 是什么意思呢?当我们用它来比较另一个对象时,它们是如何比较的,换句话说,golang 是如何确定一个对象是 nil 的

编辑:例如,如果接口为 nil,则其类型和值必须同时为 nil。 golang 是怎么做到的?

原文由 starkshang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 656
2 个回答

在 Go 中, nil指针、接口、映射、切片、通道和函数类型的零值,代表 未初始化 的值。

nil 并不意味着一些“未定义”状态,它本身就是一个适当的值。 Go 中的对象是 nil 仅当且仅当它的值为 nil 时,只有当它是上述类型之一时它才可能是。

error 是一个接口,因此 nil 是一个有效值,与 string 不同。由于显而易见的原因,a nil 错误表示 _没有错误_。

原文由 LemurFromTheId 发布,翻译遵循 CC BY-SA 3.0 许可协议

nil 在Go中就是 NULL 其他语言的指针值。

您可以有效地使用它来代替任何指针或接口(接口有点像指针)。

您可以将其用作错误,因为 错误类型是 interface

您不能将它用作字符串,因为在 Go 中,字符串是一个值。

nil 在 Go 中是无类型的,这意味着你不能这样做:

 var n = nil

因为这里缺少 n 的类型。但是,您可以

var n *Foo = nil

请注意 nil 是指针和接口的零值,未初始化的指针和接口将为 nil

原文由 Elwinar 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题