该程序可在 Go Playground 上使用 https://play.golang.org/p/2gLydmLeHf reads
package main
import "fmt"
func main() {
var name string = nil
fmt.Println(name)
}
并产生错误
prog.go:6: cannot use nil as type string in assignment
我明白""是字符串的“零值” https://tour.golang.org/basics/12。我不明白为什么我不能分配nil
to my string
.
简单的答案是nil
未定义为类型的有效值string
in the 语言规范 https://golang.org/ref/spec.
...但也许您想要更长的答案?
nil
是指针、接口、通道、切片、映射和函数类型的零值,它代表一个未初始化的 state.
考虑以下变量声明:
var a *SomeType
var b interface{}
var c func()
所有这些变量都会有一个代表未初始化状态的值,这似乎很自然。a
已被声明为指针,但是当我们还没有将其指向任何东西时,它会指向什么?nil
对于这些类型来说显然是零值。
对于通道、切片和贴图,它们的零值为nil
原因很简单,他们的执行是这样的,它们必须在使用之前显式初始化。这主要是出于性能原因,这些类型在内部都表示为或多或少复杂的数据结构,并且初始化它们并不是免费的。
然而,一个string
不需要初始化,并且新字符串变量的默认零值似乎很自然是空字符串,""
。因此根本没有理由nil
成为一个有效的字符串值,并将其添加到规范中只会使语言变得更加复杂并且使用起来更加麻烦。
此外,什么会nil
类型的string
代表?空字符串?我们已经有了。未初始化的字符串?没有这样的事。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)