Golang的接口
當一只鳥走路像鴨子,游泳像鴨子,叫起來也像鴨子,那么我們就認為它就是鴨子。
Duck?typing?的理念因此比喻得名。
Golang?通過?interface?實現?duck?typing。?Effective?Go?文章中這樣描述?interface:?interface
指定了一種描述對象行為的方法:如果某樣東西可以做這件事,這樣東西就可以用在這里。
再具體講,?就是當某個變量的類型實現了某個接口的所有方法?(這個時候可以稱該類型實現
滿足該接口)?,那么這個變量就能用在要求這個接口的地方。
?
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結構變量// 因為Test實現了Tester接口 MakeTest1(t)// 傳遞Tester接口變量 MakeTest1(ti)// 傳遞Test結構變量// 因為Test實現了interface{}接口 MakeTest2(t)// 傳遞Tester接口變量// 因為任何類型都實現了interface{} MakeTest2(ti)}
?
?運行結果:
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{},?大括號里看上去什么也沒有,?但認為它有一個空
的方法;Golang?里的每一種類型或者你自定義的類型,不管有沒有添加了什么具體的方法,
都認為有一個空的方法。因此每種類型自動實現了?interface{}接口,要求?interface{}的地方
就可以用任意類型的變量。
下載interface.go
轉載于:https://www.cnblogs.com/huazi/p/3506176.html
總結
- 上一篇: 求润开头的成语接龙!
- 下一篇: 新的小游戏发布啦。Pop Jungle