new()和"regular"分配之间有区别吗?

Lin*_*son 38 go

在Go中,以下两段代码之间存在显着差异:

v := &Vector{}
Run Code Online (Sandbox Code Playgroud)

而不是

v := new(Vector)
Run Code Online (Sandbox Code Playgroud)

min*_*omi 30

不,他们的回报是一样的,

package main

import "fmt"
import "reflect"

type Vector struct {
    x   int
    y   int
}

func main() {
    v := &Vector{}
    x := new(Vector)
    fmt.Println(reflect.TypeOf(v))
    fmt.Println(reflect.TypeOf(x))
}
Run Code Online (Sandbox Code Playgroud)

结果:

*main.Vector
*main.Vector
Run Code Online (Sandbox Code Playgroud)

邮件列表上有一些争论,两者都令人困惑:

https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs

有一点需要注意:

new()是获取指向未命名整数或其他基本类型的指针的唯一方法.您可以编写"p:= new(int)"但不能编写"p:=&int {0}".除此之外,这是一个偏好的问题.

资料来源:https://groups.google.com/d/msg/golang-nuts/793ZF_yeqbk/-zyUAPT-e4IJ

  • 我猜他们可以支持`p:=&0`,如果他们想要保持关键字倒计时. (3认同)

zzz*_*zzz 15

是的,两个代码片段之间存在根本区别.

v := &Vector{}
Run Code Online (Sandbox Code Playgroud)

工作用于Vector作为一个结构类型,图型,阵列型或片型

v := new(Vector)
Run Code Online (Sandbox Code Playgroud)

工程Vector任何类型.

示例:http://play.golang.org/p/nAHjL1ZEuu