定義
方法是具有特殊接收器引數的函式,即在 func 和方法名之間方法接收者。
func (s Student) GetName() string {
return s.name
}
func (s *Student) SetName(name string) {
s.name = name
}
我們可以把接收者型別為指標的成員方法叫做指標方法,把接收者型別為非指標的成員方法叫做值方法。
在你需要修改物件的時候,才必須用指標(引用傳遞),否則將所屬型別宣告為字面量即可(值傳遞)。另外避免在每個方法呼叫上覆制該值。
type Integer int
func (a *Integer) Increase(i Integer) {
*a = *a + i
}
func main() {
var a Integer = 2
var b Integer = 2
//a.Increase(b)
//(&a).Increase(b)
(*Integer).Increase(&a, b)
fmt.Println(a)
}
該方法並不屬於 Integer 類,而是屬於指向 Integer 的指標型別,我們在呼叫方法時,之所以可以直接在 a 例項上呼叫 Increase 方法,是因為 Go 語言編譯階段會自動將 a 轉化為對應的指標型別 &a
,所以真正呼叫的程式碼是 (&a).Increase(b)
。
其實是語法糖
type A struct {
name string
}
func (a A) Name() string {
a.name = "Hi! " + a.name
return a.name
}
func main() {
a := A{name: "test"}
fmt.Println(a.Name())
fmt.Println(A.Name(a))
}
a.Name()
其實就是 A.Name(a)
的語法糖,變數 a 就是所謂的方法接收者。
func NameOfA(a A) string {
a.name = "Hi! " + a.name
return a.name
}
func main() {
t1 := reflect.TypeOf(A.Name)
t2 := reflect.TypeOf(NameOfA)
fmt.Println(t1 == t2)// true
}
go 語言中函式型別只和引數與返回值相關,所以這兩個型別相等就能證明 方法本質上就是普通的函式,而接收者就是隱含的第一個引數。
本作品採用《CC 協議》,轉載必須註明作者和本文連結