Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。Go 语言的type是十分重要的。
结构体的使用
接口
// Listener 接口,所有实现了接口的函数的类型都可以转换为接口类型调用对应的函数
type Listener interface {
listen(inifile string)
}
定义结构体和方法
type Config struct {
自定义结构体
}
func (c *Config) listen(inifile string) {
自定义结构体的函数
}
使用接口
var listener Listener = new(Config)
listener.listen(inifile)
函数的使用
接口
// Listener 接口,所有实现了接口的函数的类型都可以转换为接口类型调用对应的函数
type Listener interface {
listen(inifile string)
}
定义函数类型和该类型的“方法”
// ListenFunc 是一种函数类型,其格式为 func(string)
type ListenFunc func(string)
// 定义了 ListenFunc 这个 type 的方法,这个方法将使用自己的一个实例
// 实例是 func(string) 格式的一个具体函数 lf
// 可以发现,其实上面的结构体也是 type
// 接口实际调用的是 type 的一个方法,上面的结构体是 type ,这里的函数类型是type
func (f ListenFunc) listen(inifile string) {
f(inifile)
}
// 该函数和 ListenFunc 这个 type 相匹配
func f(inifile string) {
函数的实现
}
使用接口
// f 和 ListenFunc 这个 type 相匹配
// 因为 ListenFunc 实现了 listen 方法
// 所以 Listener 类型可以接受 f 的赋值
var listener Listener = f
// 接口使用 ListenFunc 这个 type 所定义的 listen 方法
// 这个方法在上面定义为调用本身的实例 f
// 也就是说这个方法会调用 f ,最终效果和 f(inifile) 一样
listener.listen(inifile)
更具体的使用例子
// printstring 匹配 ListenFunc
func printstring(s string) {
fmt.PrintIn(s)
}
var listener Listener = printstring
listener.listen("Hello, world!")
// 输出 Hello, world!
总结:只要type(结构体或者函数)实现了 interface 里的方法,就可以把ty结构体或函数的实例赋给interface,从而使用接口调用type的方法。