Golang new 和 make 的区别

Posted Golang语言社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang new 和 make 的区别相关的知识,希望对你有一定的参考价值。

共 1522 字,阅读需 4 分钟

Go提供了两种分配原语,即newmake。它们所做的事情是不一样的,所应用的类型也不同。

make的目的不同于new,它只用于slice,map,channel的创建,并返回类型为T(非指针)的已初始化(非零值)的值;出现这种差异的原因在于,这三种类型本质上为引用类型,它们在使用前必须初始化;

小结

newmake都在堆上分配内存,但是它们的行为不同,适用于不同的类型。

make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:slice、map 和 channel

换言之,new 函数分配内存,make 函数初始化;下图给出了区别:

通过实验,可以更直观的查看两者之间的区别

package main

import "fmt"

func main() {
    p := new([]int) //p == nil; with len and cap 0
    fmt.Println(p)

    v := make([]int, 10, 50) // v is initialed with len 10, cap 50
    fmt.Println(v)

    /*********Output****************
        &[]
        [0 0 0 0 0 0 0 0 0 0]
    *********************************/

    (*p)[0] = 18        // panic: runtime error: index out of range
                        // because p is a nil pointer, with len and cap 0
    v[1] = 18           // ok
    
}

以上是关于Golang new 和 make 的区别的主要内容,如果未能解决你的问题,请参考以下文章

golang new make 区别

#yyds干货盘点#Golang make和new的区别详解

Golang make和new的区别及实现原理详解

Golang | new和make方法的区别

go语言的new和make

Go语言中内建函数new和make的区别