首页 > 后端开发 > Golang > 为什么带有指针接收器的 Go 方法似乎会修改非指针值?

为什么带有指针接收器的 Go 方法似乎会修改非指针值?

Susan Sarandon
发布: 2024-12-05 17:26:11
原创
347 人浏览过

Why Does Go's Method with a Pointer Receiver Seem to Modify Non-Pointer Values?

带有指针接收器的方法

在 Go 之旅中,练习 51 探索方法接收器。所提供的解释指出,对指向 Vertex 的指针进行操作的 Scale 方法在直接接收 Vertex 值时不起作用。但是,修改 main 函数以传递非指针 Vertex 与此断言相矛盾。

为什么会出现差异?

尽管代码接收非指针值,但 Scale成功修改变量。这种行为可以归因于 Go 的强类型系统。当在特定上下文中需要指向 T 的指针时,只有指向 T (*T) 的指针才能满足该要求。

编译器采用幕后转换来启用此行为:

“如果x(的类型)的方法集包含m并且参数列表可以分配给m的参数列表,则方法调用x.m()是有效的。如果x是可寻址的并且&x的方法set 包含 m,x.m() 是 (&x).m() 的简写:"

本质上,编译器重写了代码,当接收变量有指针时,将指针传递给非指针值接收器类型。这使得 Scale 方法能够修改原始变量。

以上是为什么带有指针接收器的 Go 方法似乎会修改非指针值?的详细内容。更多信息请关注PHP中文网其他相关文章!

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