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