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