gpt4 book ai didi

go - 函数接收器的地址因方法而异

转载 作者:数据小太阳 更新时间:2023-10-29 03:39:28 24 4
gpt4 key购买 nike

我有以下代码。 https://play.golang.org/p/YAa6cgtA3Vo

接收器指针的地址因方法调用而异。这令人费解。谁能解释为什么会这样?我是否需要将指针作为参数传递给接收者以保持相同的地址?

type myStruct struct {
//struct content is irrelevant
}

func (ptrToStruct *myStruct) returnAddress() **myStruct {
return &ptrToStruct
}

func (ptrToStruct *myStruct) method1() {
addressOfPtr := ptrToStruct.returnAddress()
fmt.Println(&ptrToStruct)
fmt.Println(addressOfPtr)
if &ptrToStruct != addressOfPtr {
fmt.Println("Different addresses!")
}
}

编辑:

我想要的是 ptrToStruct 的地址而不是它的值。我知道我可以通过键入 addressOfPtr = &ptrToStructmethod1() 中获取它,但在我的用例中,我在 returnAddress()< 中发生了一些逻辑 方法,我需要它来自那里。

最佳答案

这很简单:当你在某处有 var ms myStruct 时,调用 ms.returnAddress() 会将 ms 变量的地址传递给 returnAddress,并且该地址始终相同(这很容易可验证——自己尝试)。

现在考虑 returnAddress 定义中的 ptrToStruct 只是传递给该方法的特殊参数,它有一个具体类型 — *myStruct

这种类型在内部只是一个整数——大到足以存储平台/操作系统组合上任何内存位置的地址。

现在考虑当执行调用 ms.returnAddress() 时,获取 ms 变量的地址并将其写入 ptrToStruct 传递给 returnAddress 的参数。 而且该参数也是一个变量 — 生命周期等于函数调用的持续时间,并且仅在该函数的主体中可见。

此变量由准备函数调用的代码在调用堆栈上自动创建。(所有其他方法参数也会发生同样的情况。)

因此,当您获取 ptrToStuct 的地址时,您获取的是出现在调用堆栈上某个位置的变量的地址,一旦方法返回,该地址就会消失。

现在考虑一下:

  • Go 中的 goroutine 堆栈是可增长的(因此在增长时可能会在内存中重新定位);
  • 可以从不同的 goroutines 调用一个方法(每个 goroutines 都有自己的栈);
  • 即使从同一个 goroutine 多次调用该方法,它也可能从该 goroutine 执行的代码路径中的不同位置调用。

以上所有情况都可能导致 ptrToStruct 变量的地址在调用之间基本上是随机的。

您(可能)真正想要的只是按原样返回 ptrToStruct 的值,而不是它的地址。

如果您不想真正了解 ptrToStruct 是如何出现和消失的,请考虑从 this 开始。 .

关于go - 函数接收器的地址因方法而异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56173502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com