The Go Playground上可用的程序读取
package main import "fmt" func main() { var name string = nil fmt.Println(name) }
并产生一个错误
prog.go:6: cannot use nil as type string in assignment
我了解""是字符串的“零值”。我不明白为什么我不能分配nil给我的string。
""
nil
string
简单的答案是, 在语言规范中nil未将其定义为类型的有效值。string
…但是也许您想要更长的答案?
nil是指针,接口,通道,切片,映射和函数类型的零值,它表示 未初始化的 状态。
考虑以下变量声明:
var a *SomeType var b interface{} var c func()
所有这些变量都有一个代表未初始化状态的值,这很自然。a已被声明为指针,但是当我们还没有指向任何指针时,它将指向什么呢?nil对于这些类型,显然是零值。
a
对于通道,切片和贴图,其零值nil的原因很简单,即其 实现 必须在使用它们之前必须对其进行显式初始化。这主要是出于性能方面的考虑,所有这些类型都在内部表示为或多或少复杂的数据结构,并且初始化它们不是免费的。
但是,a string不需要初始化,并且自然的,新的字符串变量的默认零值将是一个空字符串""。因此,根本没有理由nil要使用有效的字符串值,将其添加到规范中只会使语言变得更加复杂且使用起来更加麻烦。
此外,nil类型string 代表 什么?空字符串?我们已经有了。未初始化的字符串?没有这样的事情。