方法是一个函数,它带有一个特殊的接收者实参。接收者出现在它自己的实参列表里,位于func关键字和方法名之间。
func (receiver type) MethodName(parameters) (returnTypes) {
}
只有当接收者的类型与该方法的定义在同一个包里时,你才能为它定义方法。
type Person struct {
Name string
}
func (p Person) Greetings() string {
return fmt.Sprintf("Welcome %s!", p.Name)
}
s := Person{Name: "Bronson"}
fmt.Println(s.Greetings())
// Output: Welcome Bronson!
接收者有两种:值接收者和指针接收者。
使用值接收者的方法操作的是传入值的副本,也就是说,在方法内部对接收者所做的任何修改,调用方都看不到。
你可以用指针接收者来声明方法,以便修改接收者指向的值。这样的修改对方法的调用方同样可见。
type rect struct {
width, height int
}
func (r *rect) squareIt() {
r.height = r.width
}
r := rect{width: 10, height: 20}
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 20
r.squareIt()
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 10
你可以在这里找到一些示例。也可以看看这篇关于方法的简短教程。
记住:方法不过是一个带有接收者实参的函数。