理解 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() 返回值的地址,因为它不可寻址。返回值是副本,必须先将其分配给变量,以便获取其地址。
解决方法
存在多种解决方法来解决该问题:
接收器和结果类型的一致性
建议在整个自定义类型中保持接收器和结果类型的一致性。如果大多数方法都有指针接收器,则所有方法都应该使用指针接收器。同样,如果大多数方法都返回指针,那么所有方法都应该返回指针。
以上是为什么 Go 中的指针接收器的链接方法调用失败?的详细内容。更多信息请关注PHP中文网其他相关文章!