golang之旅--接口 (interface)

#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
相關文章
相關標籤/搜索