#golang接口簡介java
go語言不是傳統的面嚮對象語言,所以沒有類和繼承的概念。golang
go語言中的接口跟java中的接口有點相似,接口能夠有多個實現。編程
go語言的接口是go的一種類型,用來指定一組方法(方法集),go的接口歸根結底就是一個方法集合。code
go語言實現接口的方式不像java同樣用implements關鍵字來實現,而是隻要實現了接口中的全部方法就認爲是實現了接口,這是一種規範或者叫約定(隱式實現)。對象
go語言中的接口每每都很短,不會存在太多方法,通常只有0到5個。繼承
#golang接口聲明(定義)接口
type 接口名 interface { Method1(param_list) return_type Method2(param_list) return_type ... }
#golang接口使用it
在Java中咱們經過implements能夠實現接口,那麼在golang中怎麼實現接口呢。編譯
在go語言中並無關鍵字來標識xx類型實現了xx接口,只是存在一個約定,當xx類型實現了接口中的全部方法,那麼就說明該類型實現了xx接口。變量
注:即便接口在類型以後才定義,兩者處於不一樣的包中,被單獨編譯:只要類型實現了接口中的方法,它就實現了此接口。
#golang接口實戰 定義一個接口
type IHttpProxy interface { GET() POST() }
實現一個接口
type HttpProxy struct {} func (httpProxy *HttpProxy) GET(){ } func (httpProxy *HttpProxy) POST(){ }
接口調用
var httpProxy IHttpProxy httpProxy = new(HttpProxy) httpProxy.GET() httpProxy.POST()
#golang接口命名規範
通常狀況下,若是接口只包含一個方法,那麼接口通常都以er結尾。好比:Logger, Reader, Printer等等。
此外若是某個接口使用的單詞自己以er結尾那麼通常以able結尾,好比:Recorverable。
咱們也能夠像java中定義接口同樣使用
I
打頭。
#面向接口編程
在go中咱們也能夠像下面這種方式編程,方法接受參數是一個接口,咱們能夠傳遞任何一個實現了該接口的對象。
func invokeHttpGET(httpProxy IHttpProxy) { httpProxy.GET() } func invokeHttpPOST(httpProxy IHttpProxy) { httpProxy.POST() }
#golang接口嵌套
接口嵌套有點相似結構嵌套,就是在接口中直接引用接口。
例以下面的接口
File
包含了ReadWrite接口和Lock接口。
type ReadWrite interface { Read(b Buffer) bool Write(b Buffer) bool } type Lock interface { Lock() Unlock() } type File interface { ReadWrite Lock Close() }
#golang類型判斷
這裏對接口的判斷有點相似多態的意思。咱們能夠動態的判斷當前接口類型的變量指向的究竟是哪一個實現。在Java中咱們會有下面這種代碼
Person p = new Man(); Person p2 = new Woman(); xxxMethod(Person person); //這個方法既能夠接受Man也能夠接受Woman。咱們要在xxxMethod中判斷究竟是Man仍是Woman,而後分別作出相應的處理。
那麼在Go中咱們怎麼來實現這種判斷呢? 經過表達式:
v, ok := varI.(T);
來表示,varI必須是一個接口變量,若是當前接口指向的是T類型,那麼返回true不然返回false。若是是true,那麼v就是完整的T類型。
####舉個例子吧
var phone Phone phone = new(NokiaPhone) phone.call() if t, ok := phone.(*NokiaPhone); ok { fmt.Printf("The type of areaIntf is: %T\n", t) } phone = new(SumsangPhone) phone.call() if t, ok := phone.(*SumsangPhone); ok { fmt.Printf("The type of areaIntf is: %T\n", t) }
####輸出結果
I am Nokia, I can call you! The type of areaIntf is: *interfaces.NokiaPhone Sumsang call. The type of areaIntf is: *interfaces.SumsangPhone