Go之介面
阿新 • • 發佈:2020-10-18
package main import "fmt" type dog struct{} func (d dog)say(){ fmt.Println("汪汪汪") } type cat struct{} // 值接收者實現介面 func (d cat)say(){ fmt.Println("喵喵喵") } type person struct{} // 指標接收者實現介面 func (p *person)say(){ fmt.Println("啊啊啊") } // 介面不管你是什麼型別,它只管你要實現什麼方法 // 定義一個抽象的型別。只要實現了say()的型別都可以成為sayer type sayer interface{ say() } // 打的函式 func da(arg sayer){ arg.say() } func main(){ // 在go語言中,介面是一種型別,是一種抽象的型別 // 介面做的事情就像是定義一個協議(規則) // 只要一臺輯器有洗衣服和帥乾的功能 // 我們就稱它為洗衣機。不關心屬性(資料),只關心行為(方法) // 一個物件只要全部實現了介面中的方法,那麼就實現了該介面 c1 := cat{} da(c1) d1 := dog{} da(d1) // 使用值型別接收者實現介面 // 型別的值和型別的指標都能夠儲存到介面 var s sayer c2 := cat{} s = &c2 s = c2 fmt.Println(s) // 使用指標接收者實現介面。 // 只有指標型別能夠儲存到介面變數中 p1 := &person{} s = p1 fmt.Println(s) // 空介面 // 空介面是指沒有定義任何方法的介面 // 因此任何型別都實現了空介面 // 空介面的型別可以儲存任意型別的變數 var x interface{} x = 100 x = true x = "你猜我是誰" fmt.Println(x) // 型別斷言 _, ok := x.(string) fmt.Println(ok) // 如果x是string型別,ok是true,否則是flase // 使用空介面作為函式的引數 myPrintln("ddd") // 空介面作為map的value var m = make(map[string]interface{}) m["name"] = "娜扎" m["age"] = 18 myPrintln(m) } func myPrintln(age interface{}){ fmt.Println(age) }