GO类型与接口的关系
一个类型实现多个接口
比如一个io类型的struct需要同时具备读和写的功能,因此需要实现多个接口(读和写接口)
// +build ignore
package main
// 一个类型实现多个接口
import (
"fmt"
)
type mywriter interface {
write()
}
type myreader interface {
read()
}
type socket struct {}
func (d *socket) write() {
fmt.Println("write...")
}
func (d *socket) read() {
fmt.Println("read...")
}
func main() {
s := new(socket)
s.write()
s.read()
}
多个类型实现同一个接口
多个类型同一个接口,但是这些类型需要是组合关系
// +build ignore
package main
// 多个类型可以实现相同的接口
import (
"fmt"
)
type Service interface {
Start() // 启动服务
Log(string) // 输出日志
}
type Logger struct{}
type GameService struct{
Logger // 组合Logger
}
// Logger实现Service接口中的Log(string)
func (l *Logger) Log(s string) {
fmt.Println(s)
}
// GameService实现Service接口中的Start()
func (g *GameService) Start() {
fmt.Println("Start...")
}
func main() {
var service Service
service = new(GameService)
service.Start()
service.Log("GameService间接实现了Log方法")
// service = new(Logger) // cannot use new(Logger) (value of type *Logger) as Service value in assignment: missing method StartcompilerInvalidIfaceAssign Logger没有实现Service接口的所有方法,导致编译错误
}
小结:
type A struct {}
type B struct {
A
}
这里B是大类型,A是小类型:只需要A、B两个类型合力完整地实现了某个接口i1,那么对于大类型B,就是实现了i1;但是对于小类型A来说,它并没有实现接口i1。
但如果实现接口i1的工作都由小类型A来做(A实现了接口i1的所有方法,B没有实现接口i1的任何方法),那么小类型A和大类型B都实现了接口i1.
接口的嵌套组合
type A interface{}
type B interface{}
type C interface{
A
B
}
一个类型S实现了A和B,那么S也实现了C;