인터페이스는 메서드를 정의한다. 구조체에서 해당 메서드를 동일하게 정의한다면 이 구조체는 인터페이스를 구현했다고 자동으로 처리 된다.
인터페이스의 메서드 정의시 매개 변수는 타입만 정의하면 되며, 이름은 필수적이지 않다. 즉 인터페이스란 메서드의 집합으로 이해할 수 있다.
어떠한 메서드도 갖지 않는 인터페이스를 빈 인터페이스라고 한다(interface{}). 해당 인터페이스의 값은 nil이며, 이것의 사용 용도는 아래와 같다.
인터페이스를 중첩하여 새로운 인터페이스를 생성할 수 있다.
type RuneReader interface {
ReadRune() (r rune, size int, err error)
}
type RuneScanner interface {
RuneReader
UnreadRune() error
}
주의할 점
인터페이스의 값의 실행 시점 타입은 구체적인 구현이 지정될 때에만 결정되며, 값은 동적(런타임) 값이다. 타입이 확실하지 않을 경우에는 항상 타입 단언을 사용하는 것이 좋다.
인터페이스 구현에서는 iface, eface가 고 언어 런타임 또는 컴파일 영역에서 정의된다. iface는 비어 있지 않은 인터페이스를 위한 것이며, eface는 빈 인터페이스를 위한 것이다.