new(T) 和 make(T,args) 是 Go 语言内建函数,用来分配内存,但适用的类型不同。
new(T) 会为 T 类型的新值分配已置零的内存空间,并返回地址(指针),即类型为 *T
的值。换句话说就是,返回一个指针,该指针指向新分配的、类型为 T 的零值。适用于值类型,如数组、结构体等。
make(T,args) 返回初始化之后的 T 类型的值,这个值并不是 T 类型的零值,也不是指针 *T
,是经过初始化之后的 T 的引用。make() 只适用于 slice、map 和 channel.
正常GO创建一个变量对象指针是不能对其进行赋值的
package main
import (
"fmt"
)
func main() {
var i *int
*i=10
fmt.Println(*i)
}
*i=10是会失败的,因为初始的i值是nil
panic: runtime error: invalid memory address or nil pointer dereference
而使用new:
func main() {
var i *int
i=new(int)
*i=10
fmt.Println(*i)
}
最后看下new和make的不一样:
二者异同
所以从这里可以看的很明白了,二者都是内存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值);而new用于类型的内存分配,并且内存置为零。所以在我们编写程序的时候,就可以根据自己的需要很好的选择了。
make返回的还是这三个引用类型本身;而new返回的是指向类型的指针。