值(非指针)上的`_`接收器是否仍然复制值?

时间:2016-02-11 20:21:27

标签: go

我的问题是,在_是接收者的情况下调用方法时是否制作了值的副本。

type Foo struct {
  // Many fields, making a large struct
}

func (_ Foo) Test(v *T) int {
  // Here we can't use the receiver but the method is still needed
}

所以我想知道在调用Foo时Go实现是否仍会复制Test()值,即使它实际上不可能实际改变接收者值。

var f Foo
f.Test() // Is this making a copy?

我也想知道指针的情况,默认情况下会自动解除引用。

var f = new(Foo)
f.Test() // Is this making a copy?

我试着看着这个集会,我觉得它可能正在制作副本,但我不知道足够确定。

有关情况的详情:

这是一个奇怪的情况,我无法使用指针。代码是机器生成的,并且需要在v参数上进行一些初始化时使类型满足接口。 (生成的代码包含有关在Foo上设置的v的元数据。)

因此,如果我将接收器设为指针,那么界面将不会被实现,因为"值"实例。对于每个实例,此方法将被调用一次,并且实例有时可能很大和/或大量创建,这就是为什么我要避免不必要的副本。

1 个答案:

答案 0 :(得分:3)

根据this blog post,调用者为返回值分配堆栈元素,并且被调用者填充它们。

这让我相信该值被复制然后被丢弃。

在_ receiver

的情况下,必须生成那个或一个专门的被调用者