在 Go 中,以下两段代码之间是否存在显着差异:
v := &Vector{}
与
v := new(Vector)
不,他们返回的都是一样的,
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
是的,这两个代码片段之间存在根本区别。
v := &Vector{}
仅适用于Vector
结构类型、映射类型、数组类型或切片类型
v := new(Vector)
适用于Vector
任何类型。
根据Effective Go,new()
是一个分配内存并将其归零的函数;也就是说,每个字段(以及结构的整个内存)都将设置为0
s。如果您设计您的结构,以便在创建它们时所有字段都应为零,那么很好并建议使用它。但是,如果您需要对要使用的初始值进行更多控制,则应使用更传统的方法。
在您提到的特定情况下,差异无关紧要,但应在其他地方注明。
我希望这有帮助!:)
这里有一个区别:对于一个结构,从is和 fromPerson
编组的 JSON字符串使用.&[]*Person{}
[]
new([]*Person)
null
json.Marshal
在此处查看示例:https: //play.golang.org/p/xKkFLoMXX1s