Golang new and make
Go 语言中 new 方法和 make 方法,都是用于分配相应类型内存空间。
1、make
make 内置函数分配并初始化(仅)slice、map 或 chan 类型的对象,返回值是所创建的类型本身。与 new 不同,make 的返回类型是所创建的类型本身,而不是指向它的指针。
函数签名:
func make(t Type, size ...IntegerType) Type
应用示例:
package main import "fmt" func main() { s := make([]string, 3, 5) m := make(map[int]string, 5) c := make(chan int, 5) fmt.Println(s, m, c) // [ ] map[] 0x1400012e000 }
2、new
new 内置函数可以对类型进行内存创建和初始化,返回的值是指向该类型新分配的零值的指针。
函数签名:
func new(Type) *Type
应用示例:
package main import "fmt" type Person struct { Name string Age int } func main() { p := new(Person) // p := Person{} p.Name, p.Age = "Tom", 18 fmt.Println(p) // &{Tom 18} }
注意:new 内建函数在代码中比较少见,因为 new 内建函数可以被取代。
3、make 和 new 的区别
本质上 make 函数初始化时,会初始化 slice、chan、map 类型的内部数据结构,new 函数并不会。make 函数合理的 len、cap 还可以提高效率和减少开销。make 和 new 函数还有以下区别:
make 函数
能够创建类型所需的内存空间,返回引用类型的本身。
具有使用范围的局限性,仅支持 channel、map、slice 三种类型。
具有独特的优势,make 函数会对三种类型的内部数据结构(长度、容量等)赋值。
new 函数
能够创建并分配类型所需的内存空间,返回指针引用(指向内存的指针)。
可被替代,能够通过字面值快速初始化。