golang:返回指针或传递引用

时间:2017-06-29 13:54:48

标签: go

"构建"最好的方法是什么?一个对象。

Leme写了一些代码:

type Car struct {
   Wheels int
   Doors  int
} 

这辆车以某种方式储存在某个地方。我的界面应该是

的类型
func (s Store) GetCar() *Car

或者我应该这样做

func (s Store) GetCar(*Car)

并传递对变量的引用?

我正在寻找某种经验法则。

谢谢!

4 个答案:

答案 0 :(得分:5)

通过查看引用超出范围来管理堆/堆栈。所以你可以毫无后顾之忧地返回指针。

func (s *Store) GetCar() *Car {
    return &Car{Store: s}
}

答案 1 :(得分:4)

最常见的方法是将其写为:

func (s Store) GetCar() *Car

或者,如果您不想使用指针,可以这样做:

func (s Store) GetCar() Car

另一种选择,使它GetCar(aCar *Car)可能有效,但它不会那么清楚,因为aCar不应该被发送为空,然后由函数填充。

答案 2 :(得分:0)

在许多情况下,这是可取的

func (s Store) GetCar() *Car

因为它更方便易读,但会带来后果。所有Car之类的变量都在函数内部创建,这意味着它们已放入堆栈中。函数返回后,该堆栈内存被标记为无效,可以再次使用。指针值(例如*Car)略有不同。因为指针实际上意味着您想与其他作用域共享该值并返回一个地址,所以必须将值存储在某个地方以便可用于调用函数。它会被复制到堆内存中并停留在那里,直到垃圾回收找不到对它的引用。

这意味着间接费用:

  • 将值从堆栈复制到堆
  • 用于垃圾收集的其他工作

如果该值相对较小,则间接费用并不重要。这就是为什么我们必须在io.Readerio.Writer中传递参数而不是返回值的原因。

如果您想全身心投入,请点击以下链接: Language Mechanics On Stacks And Pointers 和   Bad Go: pointer returns

答案 3 :(得分:-1)

从头开始在堆上创建它们。