在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
只能用于struct和interface的指针。如果是这种情况,那么是什么意思?
和当我们用它来比较另一个对象时,他们如何比较,换句话说,golang如何确定一个对象为零?
编辑:例如,如果接口为nil,则其类型和值必须同时为nil。 golang是如何做到的?
答案 0 :(得分:65)
在Go中,nil
是指针,接口,地图,切片,通道和函数类型的零值,表示未初始化的值。
nil
并不意味着某种“未定义”状态,它本身就是一个合适的值。 Go中的一个对象是nil
,当且仅当它的值为nil
时,它只能是前面提到的类型之一。
error
是一个界面,因此nil
是一个有效值,与string
不同。出于显而易见的原因,nil
错误代表无错误。
答案 1 :(得分:5)
nil
只是其他语言的NULL
指针值。
您可以有效地使用它来代替任何指针或接口(接口有点指针)。
您可以将其用作错误,因为error type is an interface。
您不能将其用作字符串,因为在Go中,字符串是值。
nil
在Go中是无类型的,这意味着你不能这样做:
var n = nil
因为这里缺少n
的类型。但是,你可以做到
var n *Foo = nil
注意nil
是指针和接口的零值,未初始化的指针和接口将是nil
。
答案 2 :(得分:2)
nil
是Go语言中预先声明的标识符,表示指针,接口,通道,映射,切片和函数类型的零值。
nil
是指针和接口的零值,未初始化的指针和接口将为零。
在Go语言中,字符串不能为nil
。字符串不符合分配nil
的条件。
a := nil // It will throw an error 'use of untyped nil'
var a *int = nil //It will work
答案 3 :(得分:1)
在 Go 中,nil
是预先声明的标识符,它不代表指针、接口、通道、映射、切片和函数类型。未初始化的指针和接口将是 nil
。字符串不符合上述任何一种类型,因此不能分配 nil
。
如果你像这样通过速记声明声明一个变量: variable:=nil
这将产生编译时错误,因为编译器不知道它必须分配给 variable
的类型。
Go map 中 slice 和 function 不支持比较,但可以用 nil
进行比较。
如果将任意两个 map、slice 或 function 分配给 nil
并相互比较,则会引发运行时错误。
但是,如果我们将 nil
赋值给任意两个指针变量并相互比较,则不会发生错误。
package main
import (
"fmt"
)
func main() {
var i *int =nil
var j *int =nil
if i==j {
fmt.Println("equal")
} else {
fmt.Println("no")
}
}
此代码工作正常,并将输出打印为 equal
。
答案 4 :(得分:0)
答案 5 :(得分:0)
nil 表示指针,界面,地图,切片和通道的值为零。 这意味着该值尚未初始化
答案 6 :(得分:0)
在Golang中,数据类型可以使用nil是指针,接口,地图,切片,通道,函数类型和错误
字符串中的值为“”
INT 中的值为零
答案 7 :(得分:0)
无 也是一个值,但唯一的区别是-它为空。
在Javascript中,未初始化变量将为 未定义 。以同样的方式,Golang将 nil 作为所有非初始化数据类型的默认值。