인터페이스 유효성 확인

컴파일 시간에 인터페이스의 준수 여부를 검증합니다. 이에는 다음이 포함됩니다:

  • 인터페이스 API의 일부로 특정 인터페이스를 구현하는 내보낸 유형을 확인합니다.
  • 동일한 인터페이스를 구현하는 유형(내보낸 및 미내보낸)이 구현 유형의 모음에 속합니다.
  • 인터페이스 유효성 확인을 위반하는 시나리오는 컴파일을 중단하고 사용자에게 알립니다.

보충: 위의 세 가지 항목은 컴파일러의 인터페이스 확인 메커니즘입니다. 일반적인 아이디어는 인터페이스 사용에 발생하는 오류가 컴파일 시간에 보고됩니다. 따라서 이 메커니즘을 사용하여 컴파일 시간에 일부 문제를 노출할 수 있습니다.

권장되지 않는 방식:

// Handler가 http.Handler를 구현하지 않으면 런타임에 오류가 발생합니다
type Handler struct {
  // ...
}
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  ...
}

권장되는 방식:

type Handler struct {
  // ...
}
// 컴파일 시간에 인터페이스 유효성 확인 메커니즘을 트리거하기 위해 사용됨
// Handler가 http.Handler를 구현하지 않으면 컴파일 시간에 오류가 발생합니다
var _ http.Handler = (*Handler)(nil)
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  // ...
}

*Handlerhttp.Handler의 인터페이스와 일치하지 않는 경우, var _ http.Handler = (*Handler)(nil) 문은 컴파일되지 않습니다.

할당문의 오른쪽은 주장된 타입의 영 값이어야 합니다. 포인터 타입(예: *Handler), 슬라이스 및 맵의 경우에는 nil입니다. 구조체 타입의 경우 빈 구조체입니다.

type LogHandler struct {
  h   http.Handler
  log *zap.Logger
}
var _ http.Handler = LogHandler{}
func (h LogHandler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  // ...
}