我正在关注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)
最后两行代表完全相同的方法调用.
另外,请阅读此答案.