Golang的接口
當(dāng)一只鳥走路像鴨子,游泳像鴨子,叫起來也像鴨子,那么我們就認(rèn)為它就是鴨子。
Duck?typing?的理念因此比喻得名。
Golang?通過?interface?實現(xiàn)?duck?typing。?Effective?Go?文章中這樣描述?interface:?interface
指定了一種描述對象行為的方法:如果某樣?xùn)|西可以做這件事,這樣?xùn)|西就可以用在這里。
再具體講,?就是當(dāng)某個變量的類型實現(xiàn)了某個接口的所有方法?(這個時候可以稱該類型實現(xiàn)
滿足該接口)?,那么這個變量就能用在要求這個接口的地方。
?
package mainimport ("reflect""fmt" )type Test struct { }func (this *Test)test() {fmt.Println("in test()") }type Tester interface {test() }func MakeTest1(v Tester) {fmt.Printf("\nIn Maketest1\n")v.(Tester).test() }func MakeTest2(v interface{}) {fmt.Printf("\nIn Maketest2\n")v.(Tester).test() }func main() {t := new(Test)var ti Testerti = tti.test()// 接口類型斷言// value為Test類型的對象// 是ti的值value := ti.(Tester)fmt.Printf("\n方式1:\n")fmt.Println(reflect.TypeOf(value))value.test()// v是ti的值,是Test類型// Tester是接口類型if v, ok := ti.(Tester); ok {fmt.Printf("\n方式2:\n")fmt.Println(reflect.TypeOf(v))v.test()}// switch type專用組合// 如果需要在if中判斷可以用上面的形式switch t := ti.(type) {case Tester:fmt.Printf("\n方式3:\n")fmt.Println("Tester")fmt.Println(reflect.TypeOf(t))t.test()default:fmt.Println("Unknow")}// 傳遞Test結(jié)構(gòu)變量// 因為Test實現(xiàn)了Tester接口 MakeTest1(t)// 傳遞Tester接口變量 MakeTest1(ti)// 傳遞Test結(jié)構(gòu)變量// 因為Test實現(xiàn)了interface{}接口 MakeTest2(t)// 傳遞Tester接口變量// 因為任何類型都實現(xiàn)了interface{} MakeTest2(ti)}
?
?運行結(jié)果:
in test()方式1: *main.Test in test()方式2: *main.Test in test()方式3: Tester *main.Test in test()In Maketest1 in test()In Maketest1 in test()In Maketest2 in test()In Maketest2 in test()
Golang?里面有個空的接口?interface{},?大括號里看上去什么也沒有,?但認(rèn)為它有一個空
的方法;Golang?里的每一種類型或者你自定義的類型,不管有沒有添加了什么具體的方法,
都認(rèn)為有一個空的方法。因此每種類型自動實現(xiàn)了?interface{}接口,要求?interface{}的地方
就可以用任意類型的變量。
下載interface.go
轉(zhuǎn)載于:https://www.cnblogs.com/huazi/p/3506176.html
總結(jié)
- 上一篇: 求润开头的成语接龙!
- 下一篇: 新的小游戏发布啦。Pop Jungle