golang:返回指针或传递引用

jis*_*ist 3 go

"构建"对象的最佳方法是什么.

Leme写了一些代码:

type Car struct {
   Wheels int
   Doors  int
} 
Run Code Online (Sandbox Code Playgroud)

不知何故,这辆车存放在某个地方.所以我的界面应该是那种类型

func (s Store) GetCar() *Car
Run Code Online (Sandbox Code Playgroud)

或者我应该做到

func (s Store) GetCar(*Car)
Run Code Online (Sandbox Code Playgroud)

并传递对变量的引用?

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

谢谢!

mat*_*ttn 7

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

func (s *Store) GetCar() *Car {
    return &Car{Store: s}
}
Run Code Online (Sandbox Code Playgroud)


eug*_*ioy 5

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

func (s Store) GetCar() *Car
Run Code Online (Sandbox Code Playgroud)

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

func (s Store) GetCar() Car
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

func (s Store) GetCar() *Car
Run Code Online (Sandbox Code Playgroud)

因为它更方便和可读,但有后果。所有变量Car都在函数内部创建,这意味着它们被放置在堆栈中。函数返回后,这块堆栈内存被标记为无效,可以再次使用。对于指针值,例如*Car. 因为指针实际上意味着您希望与其他作用域共享该值并返回一个地址,所以该值必须存储在某处以便可用于调用函数。它被复制到堆内存中并保持在那里,直到垃圾回收发现没有对它的引用。

它意味着开销:

  • 将值从堆栈复制到堆
  • 垃圾收集的额外工作

如果该值相对较小,则开销并不显着。这是一个原因,我们必须通过一个论点io.Readerio.Writer,而不是在的价值回归。

如果您想深入了解,请访问以下链接: 堆栈和指针的语言机制Bad Go:指针返回