Golang的make(map[type1]type2)的内部实现是什么?

Golang的make(map[type1]type2)的内部实现是什么?,go,hashmap,maps,native,Go,Hashmap,Maps,Native,Golang是一种本地编程语言。因此,与python和ruby等动态语言相比,还有很多局限性 当将映射初始化为m:=makeMap[string]int时,此映射m似乎能够包含无穷多个键值 但是当使用Maps literal或make with cap初始化映射时,映射不能包含无穷多个键值 一些文章说,make无上限为这个映射分配了大量内存。但这不是选项,因为如果这是真的,那么在初始化单个映射时将有巨大的内存消耗。但无论我使用什么样的计算机硬件监控工具,程序运行之前和运行期间的内存都没有区别

Golang是一种本地编程语言。因此,与python和ruby等动态语言相比,还有很多局限性

当将映射初始化为m:=makeMap[string]int时,此映射m似乎能够包含无穷多个键值

但是当使用Maps literal或make with cap初始化映射时,映射不能包含无穷多个键值

一些文章说,make无上限为这个映射分配了大量内存。但这不是选项,因为如果这是真的,那么在初始化单个映射时将有巨大的内存消耗。但无论我使用什么样的计算机硬件监控工具,程序运行之前和运行期间的内存都没有区别


func main(){
    Hello()
}

func Hello(){
    m := make(SizeRecord)
    l := 10000000
    for i := 0; i < l; i++ {
        m[strconv.Itoa(i)] = Size{float64(rand.Intn(100)), float64(rand.Intn(100)), float64(rand.Intn(100))}
    }

    fmt.Println(m)
}
程序需要一段时间才能执行

我还读了一篇文章,文章说我不知道我是否正确理解make without cap使用替代实现来表示map,并使用统一接口来访问map,就像其他容量有限的map一样

如果我的理解是错误的,谁能告诉我什么是正确的


如果我是正确的,为什么golang不以这种方式实现所有地图?

您对地图工作原理的理解是错误的。说明书上说:

大宗报价 初始容量并不限制其大小:地图会增长以适应存储在其中的项目数量,但nil地图除外。nil映射与空映射等效,只是不能添加任何元素


因此,容量只是一个提示,它会影响地图的初始大小。地图可以根据需要增长。对于具有给定容量的映射,没有单独的实现。

但为什么在将键值设置为空映射时会导致死机?如果设置空映射的键值,则不会死机。若您设置了nil映射的键值,那个么它将死机。映射是引用类型,在使用它们之前必须初始化它们。使用new,或者将其声明为空映射,如myMap:=map[string]string{}。此映射为非nil,但为空,您可以使用它。如果您使用var myMap map[string]string,那么这个映射是nil,当您使用它时,它会死机。