تأیید صحت رابط

تأیید پیروی از رابط در زمان کامپایل شامل موارد زیر است:

  • بررسی نوع صادرشده که بخشی از رابط API را پیاده‌سازی می‌کند
  • نوع‌ها (هم صادرشده و هم غیر صادرشده) که یک رابط را پیاده‌سازی می‌کنند، به مجموعه‌ای از انواع پیاده‌سازی ارتباط دارند.
  • هر سناریو که مغایرت با اعتبار رابط دارد، کامپایل را متوقف کرده و کاربر را مطلع می‌کند.

تکمیل: سه مورد فوق مکانیسم‌های بررسی رابط‌ها در کامپایلر هستند. ایده کلی این است که خطاهای استفاده از رابط در زمان کامپایل گزارش می‌شوند. بنابراین، این مکانیسم می‌تواند برخی از مشکلات را در زمان کامپایل آشکار کند.

روش توصیه نشده:

// اگر Handler رابط http.Handler را پیاده‌سازی نکند، یک خطا در زمان اجرا رخ می‌دهد 
type Handler struct {
  // ...
}
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  ...
}

روش توصیه شده:

type Handler struct {
  // ...
}
// برای ایجاد مکانیسم تأیید صحت رابط در زمان کامپایل استفاده می‌شود
// اگر Handler رابط http.Handler را پیاده‌سازی نکند، یک خطا در زمان کامپایل رخ می‌دهد
var _ http.Handler = (*Handler)(nil)
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  // ...
}

اگر *Handler با رابط http.Handler مطابقت نداشته باشد، عبارت var _ http.Handler = (*Handler)(nil) زمان کامپایل نمی‌شود.

طرف راست از اختصاص باید مقدار صفر نوع تأیید شده باشد. برای انواع اشاره‌گر (مانند *Handler)، آرایه‌ها و نقشه‌ها، این nil است؛ برای انواع ساختار، این یک ساختار خالی است.

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