【问题标题】:what should be used New() or var in go?在 go 中应该使用什么 New() 或 var?
【发布时间】:2015-07-22 18:40:01
【问题描述】:

如何为结构创建对象?

object := new(struct)

var object struct

我不明白什么时候用什么?如果两者相同,应该首选哪一个?

【问题讨论】:

标签: go


【解决方案1】:

您显示的new 语法返回一个指针,而另一个是一个值。在这里查看这篇文章; https://golang.org/doc/effective_go.html#allocation_new

实际上,我更喜欢另一种选择。它被称为复合文字,看起来像这样;

object := &struct{}

上面的例子相当于你使用new。很酷的一点是,您可以在 struct 的括号内指定任何属性的值。

何时使用什么是您需要根据具体情况做出的决定。在 Go 中,我想要其中一个有几个原因;也许只有指针*myType 实现了一些接口,而myType 没有,实例myType 可能包含大约1 GB 的数据,并且您希望确保将指针而不是值传递给其他方法等。选择使用哪个取决于用例。虽然我会说,指针很少会更糟,因为我几乎总是使用它们。

【讨论】:

    【解决方案2】:

    当你需要一个指针对象时,使用 new 或复合字面量,否则使用 var。

    尽可能使用 var,因为它更有可能在堆栈中分配,并且一旦作用域结束,内存就会被释放。我最有可能在堆中分配新内存并且需要进行垃圾收集。

    【讨论】:

    • 我认为您对堆/堆栈的评论具有误导性:考虑在函数中创建 var x T 并在最后调用 return &xnew(T) 也不一定需要在堆上分配——这取决于编译器的逃逸分析要做什么。见:golang.org/doc/faq#stack_or_heap
    • 你是对的@tomasz。它会编辑答案以使其更清晰。
    猜你喜欢
    • 2011-03-08
    • 2012-09-02
    • 2015-05-19
    • 2013-11-13
    • 2020-11-16
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2019-04-13
    相关资源
    最近更新 更多