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
相关文章
相关标签/搜索