对于golang的接口,纠结两天了,今天有种茅塞顿开的感觉,有必要写点东西了。
纠结接口,说白了就是搞不透接口,方法,结构体几者之间的关系以及具体的用途。可以简单的从三者的定义说起,接口说白了就是一个方法(method)集,结构体就是一个类,通常保存属性,方法相当于类的函数,不过有两种类型的接受者(对象),一种是值,一种是指针,指针能改变结构体中的属性值。在go中,只要结构体的方法实现(包含)了接口中所有的方法,就可以说这个结构体实现了这个接口。定义讲清楚后可以看看接口到底有什么用了,接下来给出两段代码。
package main
import "fmt"
type act interface { //定义一个act接口,包含一个write方法
write()
}
type xiaoming struct { //xiaoming结构体
}
type xiaofang struct { //xiaofang结构体
}
func (xm *xiaoming) write() { //xiaoming结构体的方法write,接收者为指针类型。即xiaoming实现了act接口
fmt.Println("xiaoming write")
}
func (xf *xiaofang) write() { //同上,xiaofang实现了act接口
fmt.Println("xiaofang write")
}
func main() {
var w act
xm := xiaoming{}
xf := xiaofang{}
w = &xm //实例化接口,由于xm是指针类型的接收者,必须加&
w.write()
w = &xf //同上
w.write()
}
输出结果为:xiaoming write
xiaofang write
这个例子同样能说明go语言面向对象的多态性质。接口实际上是作为中间体调用结构体的方法。
第二个例子: