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
}