我的问题是,当调用方法 _
是接收方时,是否复制了值 .
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
}
所以我想知道当调用 Test()
时,Go实现是否仍将复制 Foo
值,即使实际上不可能改变接收器值 .
var f Foo
f.Test() // Is this making a copy?
我也想知道指针的情况,默认情况下会自动解除引用 .
var f = new(Foo)
f.Test() // Is this making a copy?
我试着看装配,我认为它可能正在制作副本,但我只是不知道足够确定 .
有关情况的详细信息:
这是一个奇怪的情况,我不能使用指针 . 代码是机器生成的,并且需要在 v
参数上执行某些初始化时使类型满足接口 . (生成的代码包含有关 Foo
的元数据,该元数据在 v
上设置 . )
因此,如果我将接收器设为指针,则“value”实例将不会满足接口 . 对于每个实例,此方法将被调用一次,并且实例有时可能很大和/或大量创建,这就是为什么我要避免不必要的副本 .
1 回答
根据this blog post,调用者为返回值分配堆栈元素,并且被调用者填充它们 .
这使我相信该值被复制然后被丢弃 .
在_接收器的情况下,必须生成那个或专门的被调用者