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

Go 映射类型是引用类型。var m map[string]int不';t指向初始化的映射。这是什么意思?,go,Go,我在golang博客上读到: 映射类型是引用类型,如指针或切片,等等 上述m的值为零;它不指向已初始化的映射。零 在读取时,映射的行为类似于空映射,但尝试写入 nil map将导致运行时死机;不要那样做。初始化 映射,使用内置的make功能: m = make(map[string]int) make函数分配并初始化哈希映射数据结构 并返回指向它的映射值 我很难理解其中的某些部分: var m map[string]int做什么 为什么我需要写m=make(map[string]int)而不

我在golang博客上读到:

映射类型是引用类型,如指针或切片,等等 上述m的值为零;它不指向已初始化的映射。零 在读取时,映射的行为类似于空映射,但尝试写入 nil map将导致运行时死机;不要那样做。初始化 映射,使用内置的make功能:

m = make(map[string]int)
make函数分配并初始化哈希映射数据结构 并返回指向它的映射值

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

  • var m map[string]int
    做什么
  • 为什么我需要写
    m=make(map[string]int)
    而不是
    I=make(int)
var m map[string]int做什么

你们可以把它想象成一个指针,它并没有指向任何东西,但能够指向具体的值

为什么我需要写m=make(map[string]int)而不需要写I=make(int)

回到分配上来。内置函数make(T,args)的用途不同于new(T)。它仅创建切片、贴图和通道,并返回类型为T(非*T)的初始化(非零)值。区别的原因是,这三种类型在封面下表示对必须在使用前初始化的数据结构的引用。例如,切片是一个三项描述符,包含指向数据(在数组中)、长度和容量的指针,在初始化这些项之前,切片为零。对于切片、贴图和通道,make初始化内部数据结构并准备值以供使用。比如说,

make([]int, 10, 100)
分配一个100整数的数组,然后创建一个长度为10、容量为100的切片结构,指向数组的前10个元素。(制作切片时,可以省略容量;有关更多信息,请参阅切片部分。)相反,new([]int)返回指向新分配的零切片结构的指针,即指向nil切片值的指针

这些例子说明了new和make之间的区别

var p *[]int = new([]int)       // allocates slice structure; *p == nil; rarely useful
var v  []int = make([]int, 100) // the slice v now refers to a new array of 100 ints

// Unnecessarily complex:
var p *[]int = new([]int)
*p = make([]int, 100, 100)

// Idiomatic:
v := make([]int, 100)

请记住,make仅适用于贴图、切片和通道,不返回指针。要获得显式指针,请使用new分配或显式获取变量的地址。

所有字的长度都相同,即32位(4字节)64位(8字节), 取决于处理器和操作系统。它们由内存地址(表示为十六进制数)标识

基本类型的所有变量intfloatboolstring。。。是
值类型
,它们直接指向内存中包含的值。此外,数组和结构等复合类型也是值类型。当使用
=
将值类型的值分配给另一个变量时:
j=i
,会在内存中复制原始值
i

通常需要几个单词的更复杂的数据被视为参考类型。参考类型变量
r1
包含存储
r1
值的内存位置的地址(一个数字)(或至少第一个字):

对于分配
r2=r1
时的引用类型,只复制引用(地址),而不复制值!!。如果r1的值被修改,则该值的所有引用(如r1和r2)都将被反映

In-Go指针是引用类型,以及切片、贴图和通道。引用的变量存储在垃圾收集的堆中

鉴于上述陈述,很清楚为什么该条规定:

要初始化贴图,请使用内置的make函数

make函数分配并初始化哈希映射数据结构,并返回指向该结构的映射值。这意味着您可以将其写入,与

var m map[string]int
它是可读的,会产生一个
nil
映射,但是尝试写入nil映射将导致运行时死机。这就是为什么使用
make
初始化映射很重要的原因

m = make(map[string]int)
var m map[string]int做什么

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

为什么我需要写m=make(map[string]int)而不需要写I=make(int)

你不需要。您也可以创建一个初始化映射,如下所示:

m = map[string]int{}
这完全一样

映射和int之间的区别是:nil映射非常好。例如,nil映射的
len()
起作用,并且为0。使用nil映射唯一不能做的事情是存储键值对。如果要执行此操作,必须准备/初始化映射。Go中的准备/初始化是通过内置的
make
(或通过如上所示的文字映射)完成的。ints不需要此初始化过程。由于不存在nil int,因此该初始化将是完全的噪声

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

Related:
m = map[string]int{}