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

Go 值(非指针)上的``接收器是否仍复制该值?,go,Go,我的问题是,在\uuu是接收者的情况下调用方法时,是否生成值的副本 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 Fo

我的问题是,在
\uuu
是接收者的情况下调用方法时,是否生成值的副本

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”实例将无法实现接口。此方法将为每个实例调用一次,并且实例有时可能很大和/或创建的数量很大,这就是我希望避免不必要的复制的原因。

根据,调用者为返回值分配堆栈元素,被调用者填充它们

这让我相信这个值是被复制然后被丢弃的


如果receiver

可以通过生成一个巨大的接收器类型(
type hugh[1e5]int
或其他任何类型)来进行检查,调用像您这样的方法一百万次,则必须生成该被调用方或专门的被调用方,看它是否比用较小的接收器类型做同样的事情要慢得多。GC工具链并不优化用空白标识符来命名参数的情况。除非我有时间检查程序集并查看实际的差异,否则我将删除我的答案,因为~4ns的节省量小于任何实际工作的统计噪声。一般来说,CPU的复制速度非常快,所以除非您的结构非常大,否则不必担心这一点。在这种情况下,只需使用一个指针,因为如果不取消对它的引用,就不会支付查找费用。@JimB,MuffinTop,Two:谢谢。这是一个奇怪的情况,我不能使用指针。代码是机器生成的,需要在对
v
参数进行初始化时实现接口。(生成的代码包含关于
Foo
的元数据,该元数据在
v
上设置),因此如果我将其设置为指针,则值实例将无法实现该接口。这将为每个实例调用一次,并且有时可以创建大量实例。所以这是一个不寻常的情况,让我今天来到这里。:-。。。如果结果是一个问题,我可能只需要解析目标代码并确定它是否足够大,是否需要一个指针。不过,如果能看到它得到优化,那就太好了。谢谢,是的,从测试中确实可以看出该值确实被复制了。似乎是一个安全的优化,以避免复制,但由于这是一个不寻常的情况,这并不奇怪,我太多的优化不存在。