首页 > 后端开发 > Golang > 为什么我可以使用对象而不是指针来调用带有指针接收器的 Go 方法?

为什么我可以使用对象而不是指针来调用带有指针接收器的 Go 方法?

DDD
发布: 2024-12-28 11:41:21
原创
722 人浏览过

Why Can I Call a Go Method with a Pointer Receiver Using an Object Instead of a Pointer?

调用用于带有对象的指针的方法

在 Go 中,可以使用对象而不是指向它的指针。这可能看起来不寻常,但根据 Go 规范,这是允许的。

考虑以下代码:

package main

import "math"

type Vertex struct {
    X, Y float64
}

func (v Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func (v *Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

func main() {
    v := Vertex{3, 4}
    v.Scale(10) // v is not a pointer to a Vertex object
    fmt.Println(v.Abs())
}
登录后复制

在此示例中,v 是 Vertex 类型的对象,Scale 是用于指向 Vertex 的指针的方法。但是,我们没有传递指向 v 的指针,而是直接调用 v.Scale(10)。

为什么这不是错误?答案在于 Go 规范中定义的方法调用规则:

If x is addressable and &x's method set contains m, x.m() is shorthand for (&x).m().
登录后复制

该规则规定,如果被调用的值是可寻址的(即,它是局部变量或指针),则调用其上的方法相当于调用其地址上的方法。在本例中,v 是局部变量,因此 v.Scale(10) 被解释为就好像我们写了 (&v).Scale(10) 一样。

这种便利使我们能够写得更干净、更简洁代码,而不必在调用方法之前显式创建指向对象的指针。但是,需要注意的是,这仅适用于具有指针接收器的方法。对于具有值接收器的方法,不允许传递指向对象的指针。

以上是为什么我可以使用对象而不是指针来调用带有指针接收器的 Go 方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

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