首页 > 后端开发 > Golang > 为什么 Go 中的指针接收器的链接方法调用失败?

为什么 Go 中的指针接收器的链接方法调用失败?

Susan Sarandon
发布: 2024-11-29 13:03:10
原创
560 人浏览过

Why Does Chaining Method Calls Fail with Pointer Receivers in Go?

理解 Go 中的“无法获取地址”和“无法调用指针方法”

尽管功能相似代码片段中,一个可以编译并运行,而另一个会生成错误:

// This compiles and works
diff := projected.Minus(c.Origin)
dir := diff.Normalize()

// This does not (yields the errors in the title)
dir := projected.Minus(c.Origin).Normalize()
登录后复制

差异归因于 Normalize() 方法的接收器类型的差异。

Go 方法中的接收器类型

Go 方法可以有值接收器或指针接收者。值接收器对结构的副本进行操作,而指针接收器对原始结构本身进行操作。

在 Normalize() 的情况下,它有一个指针接收器,需要一个指向 Vector3 值的指针作为接收者。

寻址变量和返回值

Go 中的变量是可寻址的,这意味着变量的地址可以作为参数传递给指针接收器方法。但是,函数和方法调用的返回值是不可寻址的。

带有指针接收器的链式调用

在编译的示例中,编译器自动获取地址diff 变量以匹配 Normalize() 的指针接收器。

在未编译的示例中,编译器无法自动获取Minus() 返回值的地址,因为它不可寻址。返回值是副本,必须先将其分配给变量,以便获取其地址。

解决方法

存在多种解决方法来解决该问题:

  • 值接收者:修改 Normalize() 为值接收器,无需获取返回值的地址。
  • 指针返回值:修改 Minus() 以返回指向 Vector3 的指针。
  • 辅助函数: 创建一个返回值地址的辅助函数,允许所需的链接

接收器和结果类型的一致性

建议在整个自定义类型中保持接收器和结果类型的一致性。如果大多数方法都有指针接收器,则所有方法都应该使用指针接收器。同样,如果大多数方法都返回指针,那么所有方法都应该返回指针。

以上是为什么 Go 中的指针接收器的链接方法调用失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板