Schnittstellenrationalitätsprüfung

Überprüfen Sie die Einhaltung der Schnittstelle zur Compile-Zeit. Dies beinhaltet:

  • Überprüfung des exportierten Typs, der eine bestimmte Schnittstelle als Teil der Schnittstellen-API implementiert
  • Die Typen (sowohl exportiert als auch nicht exportiert), die die gleiche Schnittstelle implementieren, gehören zur Sammlung der implementierenden Typen
  • Jegliche Szenarien, die gegen die Schnittstellenrationalität verstoßen, beenden die Kompilierung und benachrichtigen den Benutzer

Ergänzung: Die oben genannten drei Punkte sind die Schnittstellenprüfmechanismen des Compilers. Die allgemeine Idee ist, dass Fehler bei der Verwendung der Schnittstelle zur Compile-Zeit gemeldet werden. Daher kann dieser Mechanismus verwendet werden, um einige Probleme zur Compile-Zeit aufzudecken.

Nicht empfohlener Ansatz:

// Wenn Handler http.Handler nicht implementiert, tritt zur Laufzeit ein Fehler auf
type Handler struct {
  // ...
}
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  ...
}

Empfohlener Ansatz:

type Handler struct {
  // ...
}
// Wird verwendet, um den Mechanismus zur Schnittstellenrationalitätsprüfung zur Compile-Zeit auszulösen
// Wenn Handler http.Handler nicht implementiert, tritt zur Compile-Zeit ein Fehler auf
var _ http.Handler = (*Handler)(nil)
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  // ...
}

Wenn *Handler nicht mit der Schnittstelle von http.Handler übereinstimmt, wird die Aussage var _ http.Handler = (*Handler)(nil) nicht kompilieren.

Die rechte Seite der Zuweisung sollte der Nullwert des behaupteten Typs sein. Für Zeiger, Slice und Maps ist dies nil; für Strukturtypen ist dies eine leere Struktur.

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