Verifikasi Rasionalitas Antarmuka
Memvalidasi kepatuhan antarmuka pada saat kompilasi. Ini termasuk:
- Memeriksa tipe yang diekspor yang mengimplementasikan antarmuka tertentu sebagai bagian dari antarmuka API
- Tipe-tipe (baik yang diekspor maupun yang tidak diekspor) yang mengimplementasikan antarmuka yang sama termasuk dalam kumpulan tipe yang mengimplementasikannya
- Setiap skenario yang melanggar pemeriksaan rasionalitas antarmuka akan menghentikan kompilasi dan memberi tahu pengguna
Tambahan: Ketiga poin di atas adalah mekanisme pemeriksaan antarmuka dari kompiler. Ide umumnya adalah kesalahan dalam menggunakan antarmuka akan dilaporkan pada saat kompilasi. Oleh karena itu, mekanisme ini dapat digunakan untuk mengekspos beberapa masalah pada saat kompilasi.
Pendekatan yang tidak disarankan:
// Jika Handler tidak mengimplementasikan http.Handler, akan terjadi kesalahan saat runtime
type Handler struct {
// ...
}
func (h *Handler) ServeHTTP(
w http.ResponseWriter,
r *http.Request,
) {
...
}
Pendekatan yang disarankan:
type Handler struct {
// ...
}
// Digunakan untuk memicu mekanisme pemeriksaan rasionalitas antarmuka pada saat kompilasi
// Jika Handler tidak mengimplementasikan http.Handler, akan terjadi kesalahan pada saat kompilasi
var _ http.Handler = (*Handler)(nil)
func (h *Handler) ServeHTTP(
w http.ResponseWriter,
r *http.Request,
) {
// ...
}
Jika *Handler
tidak cocok dengan antarmuka http.Handler
, pernyataan var _ http.Handler = (*Handler)(nil)
tidak akan terkompilasi.
Sisi kanan dari assignment harus merupakan nilai nol dari tipe yang disertakan. Untuk tipe pointer (seperti *Handler
), slice, dan map, ini adalah nil
; untuk tipe struktur, ini adalah struktur kosong.
type LogHandler struct {
h http.Handler
log *zap.Logger
}
var _ http.Handler = LogHandler{}
func (h LogHandler) ServeHTTP(
w http.ResponseWriter,
r *http.Request,
) {
// ...
}