new 函数

new 是一个用来分配内存的内置函数,但是与 C++ 不一样的是,它并不初始化内存,只是将其置零。也就是说,new(T) 会为类型 T 分配被置零的内存,并且返回它的地址,一个类型为 *T 的值。在 Golang 的术语中,其返回一个指向新分配的类型为 T 的指针,这个指针指向的内容的值为零 (zero value)。比如下面的代码:

  1. nick := new(Person)

这里的变量 nick 是一个指针:

  1. fmt.Printf("%T", nick)

输出的结果为:*main.Student

而通过下面方式声明的变量:

  1. var nick Person

类型则是:main.Student

使用 new 函数时,声明变量和分配内存并不需要放在一起,可以先声明一个变量,然后再通过 new 函数为之分配内存,比如下面的写法:

var nick *Person

nick = new (Person)

new 函数的特点是只能把内存初始化为零值并返回其指针,如果要通过字面量初始化该内存就需要使用混合字面量语法 (composite literal syntax)

&T{…}

比如下面的写法:

  1. nick := &Person{
  2. Name: "nick",
  3. Age: 28,
  4. Email: "nickli@xxx.com",
  5. }

此时 nick 的类型也是 *Person。因此我们可以得出下面的结论:

表达式 new(Type) 和 &Type{} 是等价的。