18

我正在关注 Go 教程并且因为我无法理解特定的方法签名而陷入困境:

func (p *Page) save() error {
    filename := p.Title + ".txt"
    return ioutil.WriteFile(filename, p.Body, 0600)
}

文档对此进行了如下解释:

该方法的签名为:“这是一个名为 save 的方法,它的接收者 p 是一个指向 Page 的指针。它不接受任何参数,并返回一个 error 类型的值。”

我无法理解接收器是什么。我会将其视为参数,但随后我希望参数位于save().

4

2 回答 2

22

接收者只是参数的一个特例。Go通过将第一个参数声明为接收者来提供语法糖来将方法附加到类型。

例如:

func (p *Page) save() error

读取“附加一个调用的方法,该方法save返回一个error类型*Page,而不是声明:

func save(p *Page) error

这将读取“声明一个调用的函数,该函数save接受一个类型的参数*Page并返回一个error

为了证明它只是语法糖,您可以尝试以下代码:

p := new(Page)
p.save()
(*Page).save(p)

最后两行代表完全相同的方法调用。

另外,请阅读此答案

于 2013-07-29T19:45:28.860 回答
10

接收者是您声明方法的对象。

当想要向对象添加方法时,可以使用此语法。

例如:http ://play.golang.org/p/5n-N_Ov6Xz

于 2013-07-29T19:42:02.367 回答