use*_*286 25 variable-assignment go
The Go Playground上提供的节目为
package main
import "fmt"
func main() {
var name string = nil
fmt.Println(name)
}
Run Code Online (Sandbox Code Playgroud)
并产生错误
prog.go:6: cannot use nil as type string in assignment
Run Code Online (Sandbox Code Playgroud)
我理解的""是字符串的"零值".我不明白为什么我不能分配nil给我string.
Lem*_*eId 41
简单的答案是,nil没有定义为类型的有效值string在语言规范.
...但也许你想要更长的答案?
nil是指针,接口,通道,切片,映射和函数类型的零值,它表示未初始化状态.
请考虑以下变量声明:
var a *SomeType
var b interface{}
var c func()
Run Code Online (Sandbox Code Playgroud)
所有这些变量都具有代表未初始化状态的值似乎很自然.a已被宣布为指针,但当我们还没有指出它时,它会指向什么?nil这些类型是一个明显的零值.
对于通道,切片和映射,它们的零值仅仅是nil因为它们的实现必须在它们可以被使用之前被显式初始化.这主要是出于性能原因,这些类型在内部都表示为或多或少复杂的数据结构,并且初始化它们不是免费的.
但是,a string不需要初始化,并且新字符串变量的默认值零值似乎是空字符串"".因此,没有理由nil成为有效的字符串值,将其添加到规范只会使语言更复杂,使用起来更麻烦.
什么nil类型string 代表什么?一个空字符串?我们已经有了.一个未初始化的字符串?没有这样的事情.
因为Golangstring是只读的字节切片。
但是,指向字符串 (*string) 的指针可以为 nil:
var s *string
s = nil
readonly := "readonly"
s = &readonly
dereference := *s
Run Code Online (Sandbox Code Playgroud)
https://dhdersch.github.io/golang/2016/01/23/golang-when-to-use-string-pointers.html