聊一聊 Go 的接口 Go主题月

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

这篇文章将会聊一聊 Go 接口相关的内容。

隐式接口

在 Go 语言中定义接口需要使用 interface 关键字,而且只能定义方法,不能包含成员变量,例如:

1
2
3
go复制代码type error interface {
Error() string
}

我们可以通过实现 Error() string 方法,从而间接地实现了 error 接口,而不需要显式地去实现接口:

1
2
3
4
5
6
7
8
go复制代码type RPCError struct {
Code int64
Message string
}

func (e *RPCError) Error() string {
return fmt.Sprintf("%s, code=%d", e.Message, e.Code)
}

结构体与指针

我们可以使用结构体或指针作为接口实现的接收者,但这两种类型是不一样的,而且两种实现是不可以同时存在的。

1
2
3
4
5
6
7
8
go复制代码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{} 类型并不是表示任意类型。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%