Go 映射类型是引用类型。var m map[string]int不';t指向初始化的映射。这是什么意思?
我在golang博客上读到: 映射类型是引用类型,如指针或切片,等等 上述m的值为零;它不指向已初始化的映射。零 在读取时,映射的行为类似于空映射,但尝试写入 nil map将导致运行时死机;不要那样做。初始化 映射,使用内置的make功能: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)而不
m = make(map[string]int)
make函数分配并初始化哈希映射数据结构
并返回指向它的映射值
我很难理解其中的某些部分:
做什么var m map[string]int
- 为什么我需要写
而不是m=make(map[string]int)
I=make(int)
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字节), 取决于处理器和操作系统。它们由内存地址(表示为十六进制数)标识 基本类型的所有变量如int,float,bool,string。。。是
值类型
,它们直接指向内存中包含的值。此外,数组和结构等复合类型也是值类型。当使用=
将值类型的值分配给另一个变量时: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
是字符串到整数的映射,无论是否初始化。Likei
是int的变量。现在INT可以直接使用,而地图需要更多的步骤,因为语言就是这样工作的。Related:
m = map[string]int{}