一尘不染

使用指针接收器调用函数的语法

go

在Go中,如果我定义了一个以指针作为接收器的函数,那么它不应该只允许从指针调用该函数吗?为什么可以从值本身调用此函数并产生相同的效果。

例如,在以下程序中:m1.reset()和m2.reset()具有相同的效果。即使m1是一个值而m2是一个指针。

我有点困惑,因为有 两种方法可以做同一件事, 而且不确定要遵循哪种方法。尽管大多数代码遵循使用指针字段调用函数的 约定 。我想念什么吗?

package main

    import "fmt"

    type MyStruct struct {
        X int
    }

    func (m *MyStruct) reset() {
        m.X = 0
    }

    func main() {
        m1 := MyStruct{1}
        m2 := &MyStruct{1}

        fmt.Println(m1.X)
        fmt.Println(m2.X)

        m1.reset()
        m2.reset()

        fmt.Println(m1.X)
        fmt.Println(m2.X)
    }

阅读 179

收藏
2020-07-02

共1个答案

一尘不染

规格

对应的指针类型 T的方法集是接收者 T或T的所有方法的集(也就是说,它也包含T的方法集)。

关于方法调用的下一条必要信息如下:

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

将以上两个内容放在一起,您将获得所看到的行为。

2020-07-02