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
我明白 ""
是 strings 的“零值” 。我不明白为什么我不能将 nil
分配给我的 string
。
原文由 user319286 发布,翻译遵循 CC BY-SA 4.0 许可协议
简单的答案是
nil
在 语言规范 中未定义为类型string
的有效值。…但也许您想要更长的答案?
nil
是指针、接口、通道、切片、映射和函数类型的零值,代表 未初始化 状态。考虑以下变量声明:
所有这些变量都有一个表示未初始化状态的值似乎很自然。
a
已被声明为一个指针,但当我们还没有指向任何东西时,它会指向什么?nil
是这些类型的明显零值。至于通道、切片和映射,它们的零值为
nil
原因很简单,它们的 实现 必须在使用前明确初始化。这主要是出于性能原因,这些类型在内部都表示为或多或少复杂的数据结构,并且初始化它们不是免费的。但是,a
string
不需要初始化,并且新字符串变量的默认零值似乎很自然是空字符串""
。因此,根本没有理由nil
是一个有效的字符串值,将它添加到规范中只会使语言更复杂,使用起来更麻烦。此外,
nil
类型string
代表 什么?一个空字符串?我们已经有了。未初始化的字符串?没有这样的事情。