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,
) {
// ...
}