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

时间:2012-11-06 05:30:28

标签: go

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

v := &Vector{}

而不是

v := new(Vector)

5 个答案:

答案 0 :(得分:23)

没有。他们返回的是相同的,

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))
}

结果:

*main.Vector
*main.Vector

邮件列表上存在争议,两者都令人困惑:

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

答案 1 :(得分:13)

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

v := &Vector{}

Vector是结构类型,地图类型,数组类型或切片类型

v := new(Vector)

适用于任何类型的Vector

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

答案 2 :(得分:5)

根据Effective Gonew()是一个分配内存的函数,并将其归零;即每个字段(以及结构的整个内存)将设置为0 s。如果你设计你的结构,那么当它们被创建时,所有字段应该等于零,而不是很好并且建议使用它。但是,如果您需要更多地控制要使用的初始值,则应使用更常规的方法。

在特定情况下,您提到差异是无关紧要的,但应在其他地方注明。

我希望这有帮助! :)

答案 3 :(得分:0)

在此示例中,这两个值都将在堆上分配。 Go与C不同,您可以在其中明确确定内存的分配位置。 Go在编译时执行“转义分析”,如果有必要,将在堆上分配内存。据我所知,如果你引用一个对象的地址,它将被分配在堆上。由于v := &Vector{}Vector{}的地址分配给v,编译器将决定是否需要在堆上分配。

答案 4 :(得分:0)

这是一个区别:对于Person结构,&[]*Person{}编组的JSON字符串为[]new([]*Person)编组的null使用json.Marshal }}

在此处查看示例:https://play.golang.org/p/xKkFLoMXX1s