为什么字符串在 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

原文由 user319286 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

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

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

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

考虑以下变量声明:

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

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

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

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

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

原文由 LemurFromTheId 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 GarMan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题