58

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

v := &Vector{}

v := new(Vector)
4

4 回答 4

47

不,他们返回的都是一样的,

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

于 2012-11-06T05:58:44.730 回答
22

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

v := &Vector{}

适用于Vector结构类型、映射类型、数组类型或切片类型

v := new(Vector)

适用于Vector任何类型

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

于 2012-11-06T07:08:53.777 回答
-1

根据Effective Gonew()是一个分配内存并将其归零的函数;也就是说,每个字段(以及结构的整个内存)都将设置为0s。如果您设计您的结构,以便在创建它们时所有字段都应为零,那么很好并建议使用它。但是,如果您需要对要使用的初始值进行更多控制,则应使用更传统的方法。

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

我希望这有帮助!:)

于 2012-11-06T06:01:57.383 回答
-5

这里有一个区别:对于一个结构,从is和 fromPerson编组的 JSON字符串使用.&[]*Person{}[]new([]*Person)nulljson.Marshal

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

于 2018-03-12T07:15:37.283 回答