带有指针接收器的方法
在 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中文网其他相关文章!