"构建"最好的方法是什么?一个对象。
Leme写了一些代码:
type Car struct {
Wheels int
Doors int
}
这辆车以某种方式储存在某个地方。我的界面应该是
的类型func (s Store) GetCar() *Car
或者我应该这样做
func (s Store) GetCar(*Car)
并传递对变量的引用?
我正在寻找某种经验法则。
谢谢!
答案 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.Reader
和io.Writer
中传递参数而不是返回值的原因。
如果您想全身心投入,请点击以下链接: Language Mechanics On Stacks And Pointers 和 Bad Go: pointer returns
答案 3 :(得分:-1)
从头开始在堆上创建它们。