یک متد تابعی است که یک آرگومان _گیرنده_ی ویژه دارد.
گیرنده در فهرست آرگومانهای خودش، بین کلیدواژهی 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
چند مثال را اینجا میتوانید ببینید. همچنین این آموزش کوتاه دربارهی متدها را ببینید.
به یاد داشته باشید: متد فقط یک تابع است که یک آرگومان گیرنده دارد.