为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕沐林林 2021-12-20 19:18:12
The Go Playground 上可用的程序读取package mainimport "fmt"func main() {    var name string = nil    fmt.Println(name)}并产生错误prog.go:6: cannot use nil as type string in assignment我理解的""是 strings 的“零值”。我不明白为什么我不能分配nil给我的string.
查看完整描述

3 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

简单的答案是,nil没有定义为类型的有效值string在语言规范。


...但也许你想要一个更长的答案?


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


考虑以下变量声明:


var a *SomeType

var b interface{}

var c func()

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


至于通道、切片和映射,它们的零值很nil简单,因为它们的实现是这样的,它们必须在使用前显式初始化。这主要是出于性能原因,这些类型在内部都表示为或多或少复杂的数据结构,并且初始化它们不是免费的。


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


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


查看完整回答
反对 回复 2021-12-20
?
萧十郎

TA贡献1815条经验 获得超13个赞

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


查看完整回答
反对 回复 2021-12-20
?
繁花如伊

TA贡献2012条经验 获得超12个赞

因为 Golangstring是只读的字节切片。


但是,指向字符串 (*string) 的指针可以为零:


var s *string

s = nil

readonly := "readonly"

s = &readonly

dereference := *s

https://dhdersch.github.io/golang/2016/01/23/golang-when-to-use-string-pointers.html


查看完整回答
反对 回复 2021-12-20
  • 3 回答
  • 0 关注
  • 612 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号