Avatar ·

为什么Go需要make()和new()函数?有什么区别?

大家好!我最近刚开始学习Go,一直搞不懂为什么需要两个不同的内存分配函数:make()和new()。看起来两者都能创建对象,但文档中的例子让我更困惑了。

这是我尝试做的事情。我想创建一个slice并立即添加元素:

package main

import "fmt"

func main() {
    // 尝试通过new创建slice
    slice1 := new([]int)
    fmt.Println(slice1)  // 输出:&[]
    // 但如何添加元素?slice1 = append(slice1, 1) 不工作
    // 错误:append的第一个参数必须是slice;实际是*[]int

    // 尝试通过make创建slice
    slice2 := make([]int, 5)
    fmt.Println(slice2) // 输出:[0 0 0 0 0]
    // 可以工作,但为什么长度是5?能不能不指定长度?

    // map也是同样的情况
    var m1 map[string]int
    // m1["key"] = 1 // panic: assignment to entry in nil map

    m2 := make(map[string]int)
}