在 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。 golang 是如何做到这一点的?
str == ""
在 Go 中,nil
是指针、接口、映射、切片、通道和函数类型的零值,表示 未初始化 值。
nil
并不意味着某些“未定义”状态,它本身就是一个适当的值。 Go 中的对象是 nil
,当且仅当它的值是 nil
,它只能是上述类型之一。
error
是一个接口,因此 nil
是一个有效值,与 string
不同。出于显而易见的原因,nil
错误表示没有错误。
Go 中的 nil
只是其他语言的 NULL
指针值。
您可以有效地使用它来代替任何指针或接口(接口在某种程度上是指针)。
您可以将其用作错误,因为 error type is an interface.
您不能将其用作字符串,因为在 Go 中,字符串就是一个值。
nil
在 Go 中是无类型的,这意味着您不能这样做:
var n = nil
因为这里缺少 n
的类型。但是,你可以做
var n *Foo = nil
请注意,nil
是指针和接口的零值,未初始化的指针和接口将是 nil
。
nil
没有类型。它没有打字。你不能这样做:var n = nil
不是因为 nil 有类型,而是因为编译器无法推导出 n
的类型,它不能推迟类型,因为 nil
没有类型。
func getStuff() string { return nil }
不会与消息 cannot use nil as type string in return argument
一起编译。在 java public String getStuff() { return null; }
中工作得很好。不确定“字符串是一个值”是什么意思 - 字符串是一个字节片。
string
是与指针相反的值(或 error
,它是一个接口,本质上是一个指针)。或许concrete type这个词会更准确一些,但我不认为它对初学者来说更容易理解。
nil 也是一个值,但唯一的区别是 - 它是空的。
在 Javascript 中,未初始化的变量将是未定义的。以同样的方式,Golang 将 nil 作为所有未初始化数据类型的默认值。
对于切片和指针等数据类型“引用”其他类型,“nil”表示变量不引用实例(相当于其他语言中的空指针)
它是类型函数、映射、接口、通道和结构的变量的零值
Go 中的 nil 表示指针、接口、映射、切片和通道的零值。这意味着该值未初始化
nil
是 Go 中预先声明的标识符,表示 指针、接口、通道、映射、切片和函数类型的 零值。 nil
是指针的零值和接口,未初始化的指针和接口将为零。
在 Go 中,字符串不能是 nil
。字符串不符合分配 nil
的条件。
a := nil // It will throw an error 'use of untyped nil'
var a *int = nil //It will work
在 Go 中 nil
是预先声明的标识符,它不代表指针、接口、通道、映射、切片和函数类型。未初始化的指针和接口将是 nil
。字符串不符合上述任何一种类型,因此不能分配 nil
。如果您像这样通过速记 decleration 声明变量: variable:=nil
这将产生编译时错误,因为编译器不知道它必须分配给 variable
哪种类型。
在 Go map 中, slice 和 function 不支持比较,但可以与 nil
进行比较。如果将任意两个映射、切片或函数分配给 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
。
在 Golang 中,数据类型可以使用 nil 是指针、接口、映射、切片、通道、函数类型和错误
在字符串值是“”
在 INT 值为零