【问题标题】:How is declaring a new struct instance with "var" different from using "new" in Go?用“var”声明一个新的结构实例与在 Go 中使用“new”有什么不同?
【发布时间】:2012-06-12 03:25:18
【问题描述】:

以下代码创建结构的可用实例Car。这与使用new(Car) 有何不同?

例子:

type Car struct {
  make string
}

func Main() {
  var car Car; // how is this different than "car := new(Car)"?

  car.make = "Honda"
}

【问题讨论】:

    标签: go


    【解决方案1】:

    一个定义一个 Car 变量,另一个返回一个指向 Car 的指针。

    var car Car      // defines variable car is a Car
    car2 := new(Car) // defines variable car2 is a *Car and assigns a Car to back it
    

    car := new(Car) 可以相对于var car Car 像这样实现:

    var x Car
    car := &x
    

    【讨论】:

    • var x Car; car := &x 也等价于更惯用的形式:car := &Car{}
    • 但这是否会以任何方式改变分配,例如 C++ 中的 new 在 freestore 而非堆栈上分配?
    • @larsmans,规范并没有说它这样做,所以它依赖于编译器。我相信在当前的实现中 new 总是分配给堆,如果可以证明指针没有转义函数,另一个分配给堆栈。无论哪种方式,它都不会影响代码的正确性。
    猜你喜欢
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2012-09-02
    • 2015-10-23
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多