一尘不染

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

go

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


阅读 221

收藏
2020-07-02

共1个答案

一尘不染

简单的答案是,
语言规范中nil未将其定义为类型的有效值。string

…但是也许您想要更长的答案?

nil是指针,接口,通道,切片,映射和函数类型的零值,它表示 未初始化的 状态。

考虑以下变量声明:

var a *SomeType
var b interface{}
var c func()

所有这些变量都有一个代表未初始化状态的值,这很自然。a已被声明为指针,但是当我们还没有指向任何指针时,它将指向什么呢?nil对于这些类型,显然是零值。

对于通道,切片和贴图,其零值nil的原因很简单,即其 实现
必须在使用它们之前必须对其进行显式初始化。这主要是出于性能方面的考虑,所有这些类型都在内部表示为或多或少复杂的数据结构,并且初始化它们不是免费的。

但是,a
string不需要初始化,并且自然的,新的字符串变量的默认零值将是一个空字符串""。因此,根本没有理由nil要使用有效的字符串值,将其添加到规范中只会使语言变得更加复杂且使用起来更加麻烦。

此外,nil类型string 代表 什么?空字符串?我们已经有了。未初始化的字符串?没有这样的事情。

2020-07-02