首页 >后端开发 >Golang >为什么我无法对 Go 函数调用的结果调用指针方法?

为什么我无法对 Go 函数调用的结果调用指针方法?

Patricia Arquette
Patricia Arquette原创
2024-12-19 10:08:15997浏览

Why Can't I Call a Pointer Method on the Result of a Go Function Call?

理解“无法获取地址”和“无法调用指针方法”错误

使用 Go 时,可能会遇到错误例如“无法获取地址”或“无法调用指针方法”,使学习者感到困惑

问题:

考虑以下 Go 代码:

diff := projected.Minus(c.Origin)
dir := diff.Normalize() // error: cannot call pointer method on Vector3

// Vector3 methods
func (a *Vector3) Minus(b Vector3) Vector3 { ... }
func (a *Vector3) Normalize() Vector3 { ... }

第二行会导致编译错误,因为 Vector3.Normalize()需要一个指针接收器,这意味着它需要一个指向 Vector3 值 (*Vector3) 而不是 Vector3 的指针value.

为什么会发生:

函数和方法调用的返回值在 Go 中是不可寻址的。因此,在第二个示例中,编译器无法获取 Vector3.Minus() 结果的地址,从而阻止它对该值调用 Normalize()。

可能的解决方案:

  • 单独赋值:将返回值赋给变量并调用该变量的方法变量,如第一个示例所示,其中 dir = diff.Normalize() 有效。
  • 更改接收器类型: 修改 Normalize() 方法以具有值接收器(Vector3 而不是 *向量3)。这允许对非指针值进行链接方法调用。
  • 返回指针:使 Normalize() 返回一个指针 (*Vector3) 以避免寻址返回值的需要。
  • 创建辅助函数:创建一个函数返回一个值的地址,如pv(v)返回&v,并对其结果调用 Normalize()。

以上是为什么我无法对 Go 函数调用的结果调用指针方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn