聊一聊 Go 的接口 | Go主题月

什么是接口?接口是抽象,是没有实现的方法集合,可以帮助我们隐藏具体实现,从而达到解耦的作用。

这篇文章将会聊一聊 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{} 类型并不是表示任意类型。

猜你喜欢

转载自juejin.im/post/6945476531439271972