Arayüz Rasyonalite Doğrulaması
Derleme zamanında arayüz uyumluluğunu doğrulayın. Bu, aşağıdakileri içerir:
- Arayüz API'sinin bir parçası olarak belirli bir arayüzü uygulayan dışa aktarılmış türün kontrol edilmesi
- Aynı arayüzü uygulayan türlerin (hem dışa aktarılmış hem de dışa aktarılmamış) uygulayan türler koleksiyonuna ait olması
- Arayüz rasyonalitesi kontrolünü ihlal eden herhangi bir senaryo, derlemeyi sonlandıracak ve kullanıcıyı bilgilendirecektir
Ek: Yukarıdaki üç nokta derleyici arayüz kontrol mekanizmalarıdır. Genel fikir, arayüz kullanımındaki hataların derleme zamanında rapor edileceğidir. Bu nedenle, bu mekanizma derleme zamanında bazı problemleri ortaya çıkarabilir.
Tavsiye edilmeyen yaklaşım:
// Eğer Handler http.Handler'ı uygulamıyorsa, çalışma zamanında bir hata oluşur
type Handler struct {
// ...
}
func (h *Handler) ServeHTTP(
w http.ResponseWriter,
r *http.Request,
) {
...
}
Tavsiye edilen yaklaşım:
type Handler struct {
// ...
}
// Derleme zamanında arayüz rasyonalite kontrol mekanizmasını tetiklemek için kullanılır
// Eğer Handler http.Handler'ı uygulamıyorsa, derleme zamanında bir hata oluşur
var _ http.Handler = (*Handler)(nil)
func (h *Handler) ServeHTTP(
w http.ResponseWriter,
r *http.Request,
) {
// ...
}
*Handler
, http.Handler
arayüzüyle eşleşmiyorsa, var _ http.Handler = (*Handler)(nil)
ifadesi derlenmeyecektir.
Atama ifadesinin sağ tarafı, belirtilen türün sıfır değeri olmalıdır. İşaretçi türleri (örneğin *Handler
), dilimler ve haritalar için bu nil
'dir; yapı türleri için ise bu boş bir yapıdır.
type LogHandler struct {
h http.Handler
log *zap.Logger
}
var _ http.Handler = LogHandler{}
func (h LogHandler) ServeHTTP(
w http.ResponseWriter,
r *http.Request,
) {
// ...
}