为什么我不能在Go中使用new()初始化地图?

时间:2018-12-16 03:29:34

标签: dictionary go

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

2 个答案:

答案 0 :(得分:1)

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

来自Effective Go

  

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

答案 1 :(得分:1)

axios.post('http://example.com/email.php', { firstName: 'Fred', lastName: 'Flintstone' }) .then(response=>response.data) .then(response=>console.log('Success:', response)) .catch(err=>console.log('Error: ',err) 关键字不是直接问题。如果未初始化地图,则使用new关键字进行声明时,您将得到相同的行为,例如:

var

解决此问题的方法是初始化地图:

var a map[string]int
a["z"] = 10

使用var a map[string]int a = map[string]int{} a["z"] = 10 关键字,其工作方式相同:

new

p := new(map[string]int) *p = map[string]int{} (*p)["in p"] = 1 达到预期效果的原因是声明了地图并对其进行了初始化。

Go Playground