参数和接收器之间有什么区别

时间:2013-07-29 19:37:43

标签: go

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

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

文档解释如下:

  

此方法的签名读取:“这是一个名为save的方法,它将接收器p作为指向Page的指针。它不接受任何参数,并返回类型错误的值。”

我无法理解接收器是什么。我会读这个,因为它是一个参数,但我希望参数在save()

2 个答案:

答案 0 :(得分:9)

接收器只是参数的一个特例。 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)

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

另请阅读this answer

答案 1 :(得分:7)

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

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

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