Go中 new() 与 make() 的区别

new(T) 和 make(T,args) 是Go语言内建函数,用来分配内存,但适用的类型不同。

new(T)会为 T 类型的新值分配已置零的内存空间,并返回地址(指针),即类型为 *T 的值。话句话说就是,返回一个指针,该指针指向新分配的、类型为 T 的零值,如数组,结构体等。

make(T,args)返回初始化之后的 T 类型的值,这个值并不是 T类型的零值,也不是指针 *T ,是经过初始化之后的 T 的引用。make()只适用于 slice 、map 和 channel。

eg:

func main(){
    list := new([]int)
    list = append(list , 1)
    fmt.Println(list)
}

这段代码,不能通过编译。new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。

func main(){
    list := make([]int , 0)
    list = append(list , 1)
    fmt.Println(list)
}

这段代码可以执行,并返回 [1]。因为 make 操作返回的是一个 []int 引用(引用:可理解为 []int 的一个别名)。 该引用是一个切片,所以可以使用 append 操作。

同样的,map 和 channel 建议使用 make() 或字面量的方式进行初始化,不要用 new()。

猜你喜欢

转载自blog.csdn.net/qq_48626761/article/details/133017096