-------------------- interface 介面
// 定義:type IHumaner interface { SayHi() // 介面中只能是方法聲明,沒有實現,沒有資料欄位}// Student ...type Student struct { id int name string}func (tmp *Student) SayHi() { fmt.Println("Student[%s, %d] SayHi", tmp.name, tmp.id)}// Teacher ...type Teacher struct { addr string group string}func (tmp *Teacher) SayHi() { fmt.Println("Teacher[%s, %d] SayHi", tmp.addr, tmp.group)}// MyStrtype MyStr stringfunc (tmp *MyStr) SayHi() { fmt.Println("MyStr[%s, %d] SayHi", *tmp)}func main() { // 定義介面類型的變數 var i IHumaner // 只是實現了此介面的方法的類型,那麼這個類型的變數(接收者類型)就可以給i賦值 s := &Student{"loong", 666} i = s i.SayHi() t := &Teacher{"cls", "ShenZhen"} i = t i.SayHi() var str MyStr = "hello loong" i = &str i.SayHi() // Print Result // loong 666 ... cls ... hello loong}
-------------------- interface 介面 多態的應用
// 多態的應用func WhoSayHi(i IHumaner){ i.SayHi()}// 調用多態s := &Student{"loong", 666}t := &Teacher{"cls", "ShenZhen"}var str MyStr = "hello loong"WhoSayHi(s)WhoSayHi(t)WhoSayHi(&str)// 建立一個切片x := make([]IHumaner, 3)x[0] = sx[1] = tx[2] = &strfor _, i := range x { i.SayHi()}
-------------------- interface 空介面 (任務類型)
func main() { // 空介面是萬能類型 type tmp interface{} = 1 // 字串 tmp = "abc" tmp = &v2 // .. 等等資料類型 // ***** 列印參數的內部實現就是採用的空介面 // ftm.Println(args ...interface{})}
-------------------- 類型斷言 (類型查詢)
struct Student struct { id int name string}func main() { i := make([]interface{}, 3) i[0] = 1 i[1] = "hello go" i[2] = Student{666, "loong"} // 類型查詢 for index, data := range i { // 第一個傳回值,第二個返回判斷結果的真假 if value, ok := data.(int); ok == true { } // data.(string) data.(Student) 都可以作為判斷 } // 同理,data.(type) 也可以作用於判斷類型 return int, string, ...}