#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