基本概念和語法
- 通過關鍵字type和interface,宣告出介面類
type TestInterface interface {}
- 因為介面型別與其他資料型別不同,它是沒法被例項化的。既不能通過呼叫new函式或make函式建立出一個介面型別的值
- 我們通過 interface 來定義物件的一組行為方法,如果某個物件實現了某個介面型別的所有方法,則此物件就是這個介面的實現型別
介面型別實現規則
- 兩個方法的簽名需要完全一致
- 兩個方法的名稱要一模一樣
程式碼實現:
type Pet interface {
SetName(name string)
Name() string
Category() string
}
type Dog struct {
name string
}
func (dog *Dog) SetName(name string) {
dog.name = name
}
func (dog Dog) Name() string {
return dog.name
}
func (dog Dog) Category() string {
return "dog"
}
func TestDog(t *testing.T) {
dog := Dog{"little pig"}
_, ok := interface{}(dog).(Pet)
fmt.Printf("Dog implements interface Pet: %v\n", ok) // Dog implements interface Pet: false
_, ok = interface{}(&dog).(Pet)
fmt.Printf("*Dog implements interface Pet: %v\n", ok) // *Dog implements interface Pet: true
var pet Pet = &dog
fmt.Printf("This pet is a %s, the name is %q.\n",
pet.Category(), pet.Name()) // This pet is a dog, the name is "little pig".
dog.SetName("monster")
fmt.Printf("This pet is a %s, the name is %q.\n",
pet.Category(), pet.Name()) // This pet is a dog, the name is "monster".
}
如想看學習記錄同步的練習程式碼移步 GitHub 。
本作品採用《CC 協議》,轉載必須註明作者和本文連結