-------------------- interface 接口spa
// 定義: 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) } // MyStr type MyStr string func (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 接口 多態的應用code
// 多態的應用 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] = s x[1] = t x[2] = &str for _, i := range x { i.SayHi() }
-------------------- interface 空接口 (任務類型)blog
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, ... }