介面的定義和實現

sunny0901發表於2021-12-28
package main

import "fmt"

//定義介面型別
type Humaner interface {
   //方法,只有宣告,沒有實現,由別的型別(自定義型別)實現
  sayhi()
}

type Student struct {
   name string
   id   int
}

//Student實現了此方法
func (tmp *Student) sayhi() {
   fmt.Printf("Student[%s, %d] sayhi\n", tmp.name, tmp.id)
}

type Teacher struct {
   addr  string
   group string
}

//Teacher實現了此方法
func (tmp *Teacher) sayhi() {
   fmt.Printf("Teacher[%s, %s] sayhi\n", tmp.addr, tmp.group)
}

type Mystr string

//Mystr實現了此方法
func (tmp *Mystr) sayhi() {
   fmt.Printf("MyStr[%s] sayhi\n", *tmp)
}

//定義一個普通函式,函式的引數為介面型別
func whoSayHi(i Humaner) {
   i.sayhi()
}

func main() {
   s := &Student{"mike", 666}
   t := &Teacher{"bj", "go"}

   var str Mystr = "hello mike"

  //呼叫同一個函式,不同的表現 多型,多種形態
  whoSayHi(s)
   whoSayHi(t)
   whoSayHi(&str)

   //建立一個切片
  x := make([]Humaner, 3)
   x[0] = s
   x[1] = t
   x[2] = &str

   //第一個返回下標,第二個返回下標對應的值
  for _, i := range x {
      i.sayhi()
   }

}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章