什么是接口?接口是抽象,是没有实现的方法集合,可以帮助我们隐藏具体实现,从而达到解耦的作用。
这篇文章将会聊一聊 Go 接口相关的内容。
隐式接口
在 Go 语言中定义接口需要使用 interface 关键字,而且只能定义方法,不能包含成员变量,例如:
type error interface {
Error() string
}
我们可以通过实现 Error() string
方法,从而间接地实现了 error
接口,而不需要显式地去实现接口:
type RPCError struct {
Code int64
Message string
}
func (e *RPCError) Error() string {
return fmt.Sprintf("%s, code=%d", e.Message, e.Code)
}
结构体与指针
我们可以使用结构体或指针作为接口实现的接收者,但这两种类型是不一样的,而且两种实现是不可以同时存在的。
type Cat struct {}
type Duck interface { ... }
func (c Cat) Quack {} // 使用结构体实现接口
func (c *Cat) Quack {} // 使用结构体指针实现接口
var d Duck = Cat{} // 使用结构体初始化变量
var d Duck = &Cat{} // 使用结构体指针初始化变量
这里就会发生结构体指针实现的接口,在使用结构体初始化变量时,编译是不能通过的。
指针类型
Go 语言中有两种不同类型的接口
runtime.iface
表示带有一组方法的接口runtime.eface
表示不包含任何方法的接口 interface{}
注意了,
interface{}
类型并不是表示任意类型。