dictionary - 为什么我不能在 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
?
解决方案
new
和都make
用于在程序中分配内存,但它们的工作方式不同。new(T, args)
将内存归零并返回内存地址(类型的值*T
)但不初始化该内存。make(T, args)
另一方面初始化一个类型的值T
。需要初始化映射,因为虽然映射可以为空,但映射本身的结构仍然存在,它是非零的,因此需要在使用前进行初始化。
从有效的开始:
内置函数 make(T, args) 的用途与 new(T) 不同。它只创建切片、映射和通道,并返回 T 类型(不是 *T)的初始化(非归零)值。区别的原因是这三种类型在幕后代表了对必须在使用前初始化的数据结构的引用。例如,切片是一个三项描述符,包含指向数据(在数组内)、长度和容量的指针,在这些项被初始化之前,切片为 nil。对于切片、映射和通道,make 初始化内部数据结构并准备值以供使用。
推荐阅读
- python - 如何使用 python 请求库从 Web 下载 PDF 文件
- sql - 尝试制定 SQL 查询、JOIN 和 GROUP BY
- vue.js - Vue.js 元路由器不渲染组件
- node.js - Botkit Slackbot 每次都响应 401 错误
- java - 如何使用 android 和 Java 中的 Volley 库在 android 中检索该响应
- python - Python 记录器 - Selenium
- python - 有没有办法在数组的拆分之间获取数字的开始和结束?
- haskell - 为表达式树实现变态
- svelte - 是什么导致我的 Svelte 应用程序中出现此“无法读取未定义的属性‘标题’”错误?
- django - 在弹性 beanstalk 上配置 Apache/Django 以解决 INVALID_HOST 错误