为什么Go中的字符串不能为零?

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 代表什么?一个空字符串?我们已经有了.一个未初始化的字符串?没有这样的事情.


小智 9

在 go 中string是一种数据类型,它不是像 C/C++ 那样指向数组的指针。因此,您不能将其分配给 nil。


Roc*_*ens 8

因为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