Поговорим об интерфейсе Go | Месяц тем Go

Go
Поговорим об интерфейсе 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{}Тип не означает любой тип.