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