首页 > 后端开发 > Golang > 为什么 Go 中可以对非指针值调用指针方法?

为什么 Go 中可以对非指针值调用指针方法?

Patricia Arquette
发布: 2024-12-27 11:49:11
原创
784 人浏览过

Why Can Pointer Methods Be Called on Non-Pointer Values in Go?

非指针类型上的指针方法解释

在 Go 中,约定规定可以在指针和值上调用值方法,而指针方法仅限于指针。然而,此规则的一个明显例外是能够对非指针值执行指针方法。

考虑以下代码片段:

package main

import "fmt"

type car struct {
    wheels int
}

func (c *car) fourWheels() {
    c.wheels = 4
}

func main() {

    var c = car{}
    fmt.Println("Wheels:", c.wheels)
    c.fourWheels()
    // Here, a pointer method is invoked on a non-pointer value
    fmt.Println("Wheels:", c.wheels)
}
登录后复制

代码成功执行了指针方法 fourWheels关于非指针值 c.这似乎与既定规则相矛盾。

实际上,当对非指针值 c 调用 fourWheels 方法时,您正在使用速记符号。表达式 c.fourWheels() 等价于 (&c).fourWheels()。

Go 规范指出:“如果 x 是可寻址的并且 &x 的方法集包含 m,则 x.m() 是 ( 的简写&x).m()."

换句话说,Go 隐式解引用非指针值 c 以获得指向它的指针,即然后用作指针方法的接收者。

为了澄清关于指针方法的规则,应该解释如下:

  • 值方法可以在值和指针上调用.
  • 指针方法可以在指针上调用,在某些情况下也可以在非指针值上调用,但前提是非指针值可以通过指针。

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

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