Golang的接口
當(dāng)一只鳥(niǎo)走路像鴨子,游泳像鴨子,叫起來(lái)也像鴨子,那么我們就認(rèn)為它就是鴨子。
Duck?typing?的理念因此比喻得名。
Golang?通過(guò)?interface?實(shí)現(xiàn)?duck?typing。?Effective?Go?文章中這樣描述?interface:?interface
指定了一種描述對(duì)象行為的方法:如果某樣?xùn)|西可以做這件事,這樣?xùn)|西就可以用在這里。
再具體講,?就是當(dāng)某個(gè)變量的類(lèi)型實(shí)現(xiàn)了某個(gè)接口的所有方法?(這個(gè)時(shí)候可以稱(chēng)該類(lèi)型實(shí)現(xiàn)
滿(mǎn)足該接口)?,那么這個(gè)變量就能用在要求這個(gè)接口的地方。
?
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()// 接口類(lèi)型斷言// value為T(mén)est類(lèi)型的對(duì)象// 是ti的值value := ti.(Tester)fmt.Printf("\n方式1:\n")fmt.Println(reflect.TypeOf(value))value.test()// v是ti的值,是Test類(lèi)型// Tester是接口類(lèi)型if v, ok := ti.(Tester); ok {fmt.Printf("\n方式2:\n")fmt.Println(reflect.TypeOf(v))v.test()}// switch type專(zhuān)用組合// 如果需要在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)變量// 因?yàn)門(mén)est實(shí)現(xiàn)了Tester接口 MakeTest1(t)// 傳遞Tester接口變量 MakeTest1(ti)// 傳遞Test結(jié)構(gòu)變量// 因?yàn)門(mén)est實(shí)現(xiàn)了interface{}接口 MakeTest2(t)// 傳遞Tester接口變量// 因?yàn)槿魏晤?lèi)型都實(shí)現(xiàn)了interface{} MakeTest2(ti)}
?
?運(yùn)行結(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?里面有個(gè)空的接口?interface{},?大括號(hào)里看上去什么也沒(méi)有,?但認(rèn)為它有一個(gè)空
的方法;Golang?里的每一種類(lèi)型或者你自定義的類(lèi)型,不管有沒(méi)有添加了什么具體的方法,
都認(rèn)為有一個(gè)空的方法。因此每種類(lèi)型自動(dòng)實(shí)現(xiàn)了?interface{}接口,要求?interface{}的地方
就可以用任意類(lèi)型的變量。
下載interface.go
轉(zhuǎn)載于:https://www.cnblogs.com/huazi/p/3506176.html
總結(jié)
- 上一篇: 求润开头的成语接龙!
- 下一篇: qq三姐妹网名大全