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

Mar*_*ace 13 go

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

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

文档解释如下:

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

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

thw*_*hwd 12

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

例如:

func (p *Page) save() error
Run Code Online (Sandbox Code Playgroud)

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

func save(p *Page) error
Run Code Online (Sandbox Code Playgroud)

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

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

p := new(Page)
p.save()
(*Page).save(p)
Run Code Online (Sandbox Code Playgroud)

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

另外,请阅读此答案.

  • Go中没有类,只有类型.不过,你可以问一些关于Java的问题.想象一下,你可以取出一个java类的所有方法,并通过明确地将`this`作为参数传递给它们.一样. (3认同)

cre*_*ack 6

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

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

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