Verificación de Racionalidad de la Interfaz

Validar la conformidad de la interfaz en tiempo de compilación. Esto incluye:

  • Verificar que el tipo exportado que implementa una interfaz específica forme parte de la API de la interfaz.
  • Los tipos (tanto exportados como no exportados) que implementan la misma interfaz pertenecen a la colección de tipos que la implementan.
  • Cualquier escenario que viole la verificación de racionalidad de la interfaz terminará la compilación y notificará al usuario.

Suplemento: Los tres puntos anteriores son los mecanismos de comprobación de interfaz del compilador. La idea general es que los errores en el uso de la interfaz se informarán en el momento de la compilación. Por lo tanto, este mecanismo se puede utilizar para exponer algunos problemas en el momento de la compilación.

Enfoque no recomendado:

// Si Handler no implementa http.Handler, ocurrirá un error en tiempo de ejecución
type Handler struct {
  // ...
}
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  ...
}

Enfoque recomendado:

type Handler struct {
  // ...
}
// Utilizado para activar el mecanismo de verificación de racionalidad de la interfaz en tiempo de compilación
// Si Handler no implementa http.Handler, ocurrirá un error en tiempo de compilación
var _ http.Handler = (*Handler)(nil)
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  // ...
}

Si *Handler no coincide con la interfaz de http.Handler, la declaración var _ http.Handler = (*Handler)(nil) no se compilará.

El lado derecho de la asignación debe ser el valor cero del tipo afirmado. Para tipos de puntero (como *Handler), slices y mapas, esto es nil; para tipos de estructura, esto es una estructura vacía.

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