An interface in Go is a type defined using a set of method signatures.
golang的教程寫了這一句,翻譯就是,介面是一種特殊的類型,由一組方法簽名定義。
為什麼要用簽名,簽名定義了方法的結構,但不涉及方法的實現
隱式介面將介面的定義與其實現分開,這樣實現就可以出現在任何包中,無需事先安排。
type Reader interface {
Read(p []byte) (n int, err error)
}
type Xxxer interface {
method(value, type)
}
定義介面時.會描述一組方法簽名,一個method就是一個方法簽名,這些簽名會定義這個介面期望的期望行為,例如,你可能會定義一個Writer介面,只包括一個Write方法
type Writer interface {
Write([]byte) (int, error)
}
type
,接下來是介面名稱(動詞),接下來是關鍵字interface當你希望多個類型共享相同的行為時,你可以使用介面。例如,你可以定義一個 Speaker
介面,用於所有可以"說話"的物件。
type Speaker interface {
Speak() string
}
type Dog struct{}
func (d Dog) Speak() string { return "Woof!" }
type Cat struct{}
func (c Cat) Speak() string { return "Meow!" }
func AnimalSpeak(a Speaker) {
fmt.Println(a.Speak())
}
func main() {
d := Dog{}
c := Cat{}
AnimalSpeak(d) // 輸出:Woof!
AnimalSpeak(c) // 輸出:Meow!
}
+------------+ +------------+
| Speaker |<------| Dog |
+------------+ +------------+
| Speak() | | Speak() |
+------------+ +------------+
^
|
+------------+
| Cat |
+------------+
| Speak() |
+------------+
d := Dog{}
c := Cat{}
AnimalSpeak(d) // 輸出:Woof!
AnimalSpeak(c) // 輸出:Meow!
這個示例代碼與 UML 圖一起描述了 Dog
和 Cat
類型如何通過實現 Speaker
介面來共享相同的行為,並且如何在主函數中調用這些行為。你可以在 AnimalSpeak
函數中傳入任何實現了 Speaker
介面的類型,它將通過調用該類型的 Speak
方法來輸出對應的聲音。
如果你的類型不需要共享行為,那麼你不需要使用介面。
type Dog struct{}
func (d Dog) Bark() string { return "Woof!" }
func main() {
d := Dog{}
fmt.Println(d.Bark()) // 輸出:Woof!
}
當你需要組合多個字段時,可以使用結構。
type Person struct {
Name string
Age int
}
func main() {
p := Person{Name: "Alice", Age: 30}
fmt.Println(p.Name, p.Age) // 輸出:Alice 30
}
如果你只有一個值,你不需要結構。
type Age int
func main() {
var a Age = 30
fmt.Println(a) // 輸出:30
}
當你想要為特定類型定義行為時,你可以使用方法。
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
func main() {
c := Circle{Radius: 5}
fmt.Println(c.Area()) // 輸出半徑為5的圓的面積
}
如果函數不依賴於特定類型,那麼它是一個普通函數。
func Add(x, y int) int {
return x + y
}
func main() {
fmt.Println(Add(3, 4)) // 輸出:7
}