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{}은 임의의 유형을 나타내지 않습니다.

추천

출처juejin.im/post/6945476531439271972