猿问

为什么在 Go 中字符串不能为 nil?

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.


慕沐林林
浏览 613回答 3
3回答

神不在的星期二

简单的答案是,nil没有定义为类型的有效值string在语言规范。...但也许你想要一个更长的答案?nil是指针、接口、通道、切片、映射和函数类型的零值,它表示未初始化的状态。考虑以下变量声明:var a *SomeTypevar b interface{}var c func()所有这些变量都有一个表示未初始化状态的值,这似乎很自然。a已经被声明为一个指针,但是当我们还没有指向任何东西时,它会指向什么?nil是这些类型的明显零值。至于通道、切片和映射,它们的零值很nil简单,因为它们的实现是这样的,它们必须在使用前显式初始化。这主要是出于性能原因,这些类型在内部都表示为或多或少复杂的数据结构,并且初始化它们不是免费的。但是, astring不需要初始化,并且新字符串变量的默认零值似乎很自然是空字符串"". 因此,根本没有理由nil成为有效的字符串值,并且将其添加到规范中只会使语言变得更加复杂且使用起来更加麻烦。此外,niltypestring 代表什么?空字符串?我们已经有了。一个未初始化的字符串?没有这样的事情。

萧十郎

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

繁花如伊

因为 Golangstring是只读的字节切片。但是,指向字符串 (*string) 的指针可以为零:var s *strings = nilreadonly := "readonly"s = &readonlydereference := *shttps://dhdersch.github.io/golang/2016/01/23/golang-when-to-use-string-pointers.html
随时随地看视频慕课网APP

相关分类

Go
我要回答