Verifica della Razionalità dell'Interfaccia
Convalida della conformità dell'interfaccia durante la compilazione. Ciò include:
- Verifica del tipo esportato che implementa una specifica interfaccia come parte dell'API dell'interfaccia
- I tipi (sia esportati che non esportati) che implementano la stessa interfaccia appartengono alla collezione di tipi implementanti
- Eventuali scenari che violano il controllo della razionalità dell'interfaccia interromperanno la compilazione e avviseranno l'utente
Integrazione: I tre punti sopra sono i meccanismi di controllo dell'interfaccia del compilatore. L'idea generale è che gli errori nell'uso dell'interfaccia verranno segnalati durante la compilazione. Pertanto, questo meccanismo può essere utilizzato per individuare alcuni problemi durante la compilazione.
Approccio non raccomandato:
// Se Handler non implementa http.Handler, si verificherà un errore durante l'esecuzione
type Handler struct {
// ...
}
func (h *Handler) ServeHTTP(
w http.ResponseWriter,
r *http.Request,
) {
...
}
Approccio consigliato:
type Handler struct {
// ...
}
// Utilizzato per attivare il meccanismo di controllo della razionalità dell'interfaccia durante la compilazione
// Se Handler non implementa http.Handler, si verificherà un errore durante la compilazione
var _ http.Handler = (*Handler)(nil)
func (h *Handler) ServeHTTP(
w http.ResponseWriter,
r *http.Request,
) {
// ...
}
Se *Handler
non corrisponde all'interfaccia di http.Handler
, l'istruzione var _ http.Handler = (*Handler)(nil)
non verrà compilata.
Il lato destro dell'assegnazione dovrebbe essere il valore zero del tipo affermato. Per i tipi di puntatore (come *Handler
), slice e mappe, questo è nil
; per i tipi di struttura, si tratta di una struttura vuota.
type LogHandler struct {
h http.Handler
log *zap.Logger
}
var _ http.Handler = LogHandler{}
func (h LogHandler) ServeHTTP(
w http.ResponseWriter,
r *http.Request,
) {
// ...
}