什么意思在golang中意味着什么?

sta*_*ang 36 go

在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
}
Run Code Online (Sandbox Code Playgroud)

但我们不能这样使用它:

var str string //or var str int
str = nil
Run Code Online (Sandbox Code Playgroud)

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

看起来nil只能用于struct和interface的指针.如果是这样,那么它意味着什么?当我们用它来比较其他对象,他们如何比较,换句话说,如何golang确定一个对象是零

编辑:例如,如果接口为nil,则其类型和值必须同时为nil.golang怎么做到这一点?

Lem*_*eId 84

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

nil并不意味着一些"未定义"的状态,它本身就是一个合适的价值.Go中的一个对象nil只是当且仅当它的值是nil,它只能是它的上述类型之一.

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


Elw*_*nar 8

nil在Go中,它只是NULL其他语言的指针值。

您可以有效地使用它代替任何指针或接口(接口在某种程度上是指针)。

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

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

nil 在Go中未键入,这意味着您不能这样做:

var n = nil
Run Code Online (Sandbox Code Playgroud)

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

var n *Foo = nil
Run Code Online (Sandbox Code Playgroud)

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

  • 错误:“nil”没有类型。它没有打字。你不能这样做: `var n = nil` 不是因为 nil 有类型,而是因为编译器无法派生出 `n` 的类型,它不能推迟类型,因为,`nil ` 没有类型。 (2认同)

aja*_* mp 5

nil也是一个值,但唯一的区别是 - 它是空的。

在 Javascript 中,未初始化的变量将是undefined。同样,Golang 将nil作为所有未初始化数据类型的默认值。