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

Lye*_*ish 5 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
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道Go实现是否仍会FooTest()调用时复制值,即使实际上不可能改变接收器值.

var f Foo
f.Test() // Is this making a copy?
Run Code Online (Sandbox Code Playgroud)

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

var f = new(Foo)
f.Test() // Is this making a copy?
Run Code Online (Sandbox Code Playgroud)

我试着看装配,我认为它可能正在制作副本,但我只是不知道足够确定.


有关情况的详细信息:

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

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

Dav*_*rth 3

根据这篇博客文章,调用者为返回值分配堆栈元素,而被调用者填充它们。

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

在 _ 接收者的情况下,必须生成那个或专门的被调用者