interface 介面 -Go 學習記錄

Ali發表於2019-03-18

基本概念和語法

  • 通過關鍵字type和interface,宣告出介面類 type TestInterface interface {}
  • 因為介面型別與其他資料型別不同,它是沒法被例項化的。既不能通過呼叫new函式或make函式建立出一個介面型別的值
  • 我們通過 interface 來定義物件的一組行為方法,如果某個物件實現了某個介面型別的所有方法,則此物件就是這個介面的實現型別

介面型別實現規則

  1. 兩個方法的簽名需要完全一致
  2. 兩個方法的名稱要一模一樣

程式碼實現:

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 協議》,轉載必須註明作者和本文連結

高永立

相關文章