new
函数
new
是一个用来分配内存的内置函数,但是与 C++
不一样的是,它并不初始化内存,只是将其置零。也就是说,new(T) 会为类型 T 分配被置零的内存,并且返回它的地址,一个类型为 *T 的值。在 Golang 的术语中,其返回一个指向新分配的类型为 T 的指针,这个指针指向的内容的值为零 (zero value)。比如下面的代码:
nick := new(Person)
这里的变量 nick 是一个指针:
fmt.Printf("%T", nick)
输出的结果为:*main.Student
而通过下面方式声明的变量:
var nick Person
类型则是:main.Student
使用 new 函数时,声明变量和分配内存并不需要放在一起,可以先声明一个变量,然后再通过 new 函数为之分配内存,比如下面的写法:
var nick *Person
nick = new (Person)
new 函数的特点是只能把内存初始化为零值并返回其指针,如果要通过字面量初始化该内存就需要使用混合字面量语法 (composite literal syntax):
&T{…}
比如下面的写法:
nick := &Person{
Name: "nick",
Age: 28,
Email: "nickli@xxx.com",
}
此时 nick 的类型也是 *Person。因此我们可以得出下面的结论:
表达式 new(Type) 和 &Type{} 是等价的。