在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误差代表没有错误.
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也是一个值,但唯一的区别是 - 它是空的。
在 Javascript 中,未初始化的变量将是undefined。同样,Golang 将nil作为所有未初始化数据类型的默认值。