go - map 类型是引用类型。 var m map[string]int 不指向初始化的映射。这是什么意思?

标签 go

我在 golang 博客上看到:https://blog.golang.org/go-maps-in-action那:

var m map[string]int

Map types are reference types, like pointers or slices, and so the value of m above is nil; it doesn't point to an initialized map. A nil map behaves like an empty map when reading, but attempts to write to a nil map will cause a runtime panic; don't do that. To initialize a map, use the built in make function:

m = make(map[string]int)

The make function allocates and initializes a hash map data structure and returns a map value that points to it.

我很难理解其中的某些部分:

  • var m map[string]int 有什么作用?
  • 为什么我需要写m = make(map[string]int)而不是i = make(int)

最佳答案

What does var m map[string]int do?

它告诉编译器m是一个map[string]int类型的变量,并将map[string] int类型的“零值”赋值给m(这就是为什么 m 为 nil,因为 nil 是任何映射的零值)。

Why do I need to write m = make(map[string]int) but not i = make(int)

你不需要。您也可以像这样创建一个初始化 map :

m = map[string]int{}

这完全一样。

maps 和 ints 之间的区别是:一个 nil map 是完美的。例如。 nil map 的 len() 有效并且为 0。您不能使用 nil map 做的唯一事情是存储键值对。如果你想这样做,你必须准备/初始化 map 。 Go 中的这种准备/初始化是通过内置的 make (或通过如上所示的文字映射)完成的。 int 不需要这个初始化过程。由于没有 nil 整数,此初始化将完全是噪音。

请注意,您没有初始化变量 m:变量m 是字符串到整数的映射,无论是否初始化。就像 i 是一个整数变量。现在 int 可以直接使用,而 map 需要多一步,因为语言是这样工作的。

关于go - map 类型是引用类型。 var m map[string]int 不指向初始化的映射。这是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37568346/

相关文章:

去基础 : What is the diference between calling a method on struct and calling it on a pointer to that struct?

go - 在Visual Studio代码中调试cgo会产生“多个定义”错误

go - 使用值创建结构实例

string - 如何 fmt.Printf 带有千位逗号的整数

unit-testing - 如何对修改发送消息的 net.Conn 函数进行单元测试?

google-app-engine - 在 appspot.com 上解析 64 位 int 与在本地主机上不同?

json - 如何将 JSON 数组中的所有键大写?

json - 如何根据 swagger 架构验证 JSON 架构实例?

go - 如何将引导样式应用于自动生成的表单

go - 如何解决与此错误消息的冲突?