当我们想要在Go语言中初始化一个结构时,其实会使用到两个完全不同的关键字,也就是 make 和 new,同时出现两个用于初始化的关键字对于初学者来说可能会感到非常困惑,不过它们两者却有着完全不同的作用。
在Go语言中,make 关键字的主要作用是初始化内置的数据结构,也就是我们在前面提到的数组、切片和 Channel,而当我们想要获取指向某个类型的指针时可以使用 new 关键字,只是知道如何使用 new 的人真的比较少,下面我们就来介绍一下 make 和 new 它们的区别以及实现原理。
概述
虽然 make 和 new 都是能够用于初始化数据结构,但是它们两者能够初始化的结构类型却有着较大的不同,make 在Go语言中只能用于初始化语言中的基本类型:
slice := make([]int, 0, 100)
hash := make(map[int]bool, 10)
ch := make(chan int, 5)
这些基本类型都是语言为我们提供的,我们在前面已经介绍过了它们初始化的过程以及原理,但是在这里还是需要提醒大家注意的是,这三者返回了不同类型的数据结构:
- slice 是一个包含 data、cap 和 len 的结构体;
- hash 是一个指向 hmap 结构体的指针;
- ch 是一个指向 hchan 结构体的指针。
而另一个用于初始化数据结构的关键字 new 的作用其实就非常简单了,它只是接收一个类型作为参数然后返回一个指向这个类型的指针:
i := new(int)