Что такое интерфейс? Интерфейс — это абстракция, набор нереализованных методов, которые могут помочь нам скрыть конкретную реализацию и добиться разделения.
В этой статье речь пойдет о контенте, связанном с интерфейсом 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{}
Тип не означает любой тип.