Go语言make与new函数区别

发布时间 2024-01-08 16:02:33作者: 我是一条最咸的咸鱼

Go语言make与new方法区别

在 Go 语言中,有两个比较雷同的内置函数,分别是 newmake 方法,其主要用途都是用于分配相应类型的内存空间。

基本特性

make

在 Go 语言中,内置函数 make 仅支持 slicemapchannel 三种数据类型的内存创建,其返回值是所创建类型的本身,而不是新的指针引用

func make(t Type, size ...IntegerType) Type

实例:

func main() {
	v1 := make([]int, 1, 5)
	v2 := make(map[int]bool, 5)
	v3 := make(chan int, 1)
	   
	fmt.Println(v1, v2, v3)
   }

输出结果:

[0] map[] 0xc00001e0e0

调用 make 函数去初始化切片(slice)的类型时,会带有零值。

new

在 Go 语言中,内置函数 new 可以对类型进行内存创建和初始化。其返回值是所创建类型的指针引用,与 make 函数在实质细节上存在区别。

func new(Type) *Type

实例:

type A struct {
	Name string
}

func main() {
	s := new(A)
	s.Name = "ares"
	fmt.Println(s)
}		
# &{ares}

func main() {
	s := A{}
	s.Name = "ares"
	fmt.Println(s)
}		
# {ares}

new 函数也能初始化 make 的三种类型:

 v1 := new(chan bool)
 v2 := new(map[string]struct{})

区别

make 函数在初始化时,会初始化 slicechanmap 类型的内部数据结构,new 函数并不会。

  • make 函数:

    • 能够分配并初始化类型所需的内存空间和结构,返回引用类型的本身。
    • 具有使用范围的局限性,仅支持 channelmapslice 三种类型。
    • 具有独特的优势,make 函数会对三种类型的内部数据结构(长度、容量等)赋值。
  • new 函数:

    • 能够分配类型所需的内存空间,返回指针引用(指向内存的指针)。
    • 可被替代,能够通过字面值快速初始化。