首页 > 解决方案 > 为什么我不能在 Go 中使用 new() 初始化地图?

问题描述

package main

import "fmt"

func main() {
    p := new(map[string]int)
    m := make(map[string]int)
    m["in m"] = 2
    (*p)["in p"] = 1
    fmt.Println(m)
    fmt.Println(*p)
}

上面的代码给出了一个错误panic: assignment to entry in nil map。如果我*p在将对插入其中之前进行打印,则输出是正确的。看来我只是无法修改*p

标签: dictionarygo

解决方案


new和都make用于在程序中分配内存,但它们的工作方式不同。new(T, args)将内存归零并返回内存地址(类型的值*T)但不初始化该内存。make(T, args)另一方面初始化一个类型的值T。需要初始化映射,因为虽然映射可以为空,但映射本身的结构仍然存在,它是非零的,因此需要在使用前进行初始化。

有效的开始:

内置函数 make(T, args) 的用途与 new(T) 不同。它只创建切片、映射和通道,并返回 T 类型(不是 *T)的初始化(非归零)值。区别的原因是这三种类型在幕后代表了对必须在使用前初始化的数据结构的引用。例如,切片是一个三项描述符,包含指向数据(在数组内)、长度和容量的指针,在这些项被初始化之前,切片为 nil。对于切片、映射和通道,make 初始化内部数据结构并准备值以供使用。


推荐阅读