Weryfikacja Interfejsu Rationalność

Sprawdzenie zgodności interfejsu w czasie kompilacji. Obejmuje to:

  • Sprawdzenie eksportowanego typu, który implementuje określony interfejs jako część interfejsu API
  • Typy (zarówno eksportowane, jak i nieeksportowane), które implementują ten sam interfejs, należą do kolekcji typów implementujących
  • Wszelkie scenariusze naruszające sprawdzenie interfejsu rationalności spowodują przerwanie kompilacji i powiadomienie użytkownika

Uzupełnienie: Powyższe trzy punkty to mechanizmy sprawdzania interfejsu kompilatora. Ogólna idea polega na tym, że błędy w użyciu interfejsu zostaną zgłoszone w czasie kompilacji. Dlatego ten mechanizm może być wykorzystany do wykrywania problemów w czasie kompilacji.

Nie zalecane podejście:

// Jeśli Handler nie implementuje http.Handler, wystąpi błąd w czasie wykonania
type Handler struct {
  // ...
}
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  ...
}

Zalecane podejście:

type Handler struct {
  // ...
}
// Używane do wywoływania mechanizmu sprawdzania interfejsu rationalności w czasie kompilacji
// Jeśli Handler nie implementuje http.Handler, wystąpi błąd w czasie kompilacji
var _ http.Handler = (*Handler)(nil)
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  // ...
}

Jeśli *Handler nie pasuje do interfejsu http.Handler, instrukcja var _ http.Handler = (*Handler)(nil) nie zostanie skompilowana.

Prawa strona przypisania powinna być wartością zerową typu założonego. Dla typów wskaźnikowych (takich jak *Handler), wycinków i map, jest to nil; dla typów struktur, jest to pusta struktura.

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