Avatar ·

为什么Go需要make()和new()函数以及它们的区别?

大家好!我刚开始学习Go,对两个内置函数——make()和new()感到困惑。文档说它们都分配内存,但我不明白什么时候该用哪个。

下面是一个让我困惑的简单例子。我想创建一个map和slice:

// 方式1:使用new()
m := new(map[string]int)
s := new([]int)

// 方式2:使用make()
m2 := make(map[string]int)
s2 := make([]int, 5)

第一个方式能编译,但尝试通过m["key"] = 1向map添加值时,我得到panic: assignment to entry in nil map。slice也有问题——s[0] = 10会因nil pointer而崩溃。而第二个方式运行完美。

这其中的魔法是什么?为什么new()对map和slice不起作用?我读到new()返回指针,而make()不返回,但这并不能解释为什么一个能工作而另一个不能。请为新手解释一下。