引言
函數允許你將邏輯組織到可重復的過程中,每次運行時可以使用不同的參數。在定義函數的過程中,你會經常發現多個函數可能每次都操作同一段數據。Go可以識別這種模式,并允許您定義特殊的函數,稱為方法,其目的是對某些特定類型的實例進行操作,稱為接收器。為類型添加方法不僅可以讓你了解數據是什么,還可以讓你了解如何使用這些數據。
定義方法
定義方法的語法與定義函數的語法類似。唯一的區別是在func
關鍵字后面添加了一個額外的參數來指定方法的接收者。接收器是你想要定義方法的類型聲明。下面的例子定義了一個struct類型的方法:
package mainimport "fmt"type Creature struct {Name stringGreeting string
}func (c Creature) Greet() {fmt____Printf("%s says %s", c.Name, c.Greeting)
}func main() {sammy := Creature{Name: "Sammy",Greeting: "Hello!",}Creature.Greet(sammy)
}
如果運行這段代碼,輸出將是:
OutputSammy says Hello!
我們創建了一個名為Creature
的結構體,其中包含Name
和Greeting
的string
字段。這個Creature
只定義了一個方法Greet
。在接收器聲明中,我們將Creature
的實例賦值給變量c
,這樣我們就可以在組裝fmt____Printf
中的問候消息時引用Creature
的字段。
在其他語言中,方法調用的接收者通常通過一個關鍵字來引用(例如:’ this ‘或’ self ')。Go將接收器視為與其他變量一樣的變量,因此您可以隨意命名為您喜歡的任何名稱。社區對此參數的首選樣式是接收者類型的第一個字符的小寫版本。在這個例子中,我們使用c
,因為接收器類型是Creature
。
在main
函數體中,我們創建了一個Creature
實例,并為它的Name
和Greeting
字段指定了值。我們在這里通過將類型名和方法名與____
連接起來并提供Creature
實例作為第一個參數來調用Greet
方法。
Go提供了另一種更方便的方法來調用結構體實例的方法,如下例所示:
package mainimport "fmt"type Creature struct {Name stringGreeting string
}func (c Creature) Greet() {fmt____Printf("%s says %s", c.Name, c.Greeting)
}func main() {sammy := Creature{Name: "Sammy",Greeting: "Hello!",}sammy.Greet()
}
如果運行這個,輸出將與前面的例子相同:
OutputSammy says Hello!
這個例子和前一個相同,但這次我們使用點表示法來調用Greet