Xác minh Tính Hợp Lý của Giao diện

Xác minh sự tuân thủ của giao diện vào thời gian biên dịch. Điều này bao gồm:

  • Kiểm tra loại được xuất ra mà thực hiện một giao diện cụ thể như một phần của API giao diện
  • Các loại (cả loại được xuất và loại không được xuất) mà thực hiện cùng một giao diện thuộc vào bộ sưu tập các loại thực hiện
  • Mọi kịch bản vi phạm kiểm tra tính hợp lý của giao diện sẽ chấm dứt quá trình biên dịch và thông báo cho người dùng

Bổ sung: Ba điểm trên đây là các cơ chế kiểm tra giao diện của trình biên dịch. Ý tưởng chung là lỗi trong việc sử dụng giao diện sẽ được báo cáo vào thời gian biên dịch. Do đó, cơ chế này có thể sử dụng để tiết lộ một số vấn đề vào thời gian biên dịch.

Không khuyến khích cách tiếp cận:

// Nếu Handler không thực hiện http.Handler, một lỗi sẽ xảy ra vào thời gian chạy
type Handler struct {
  // ...
}
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  ...
}

Cách tiếp cận được khuyến nghị:

type Handler struct {
  // ...
}
// Được sử dụng để kích hoạt cơ chế kiểm tra tính hợp lý của giao diện vào thời gian biên dịch
// Nếu Handler không thực hiện http.Handler, một lỗi sẽ xảy ra vào thời gian biên dịch
var _ http.Handler = (*Handler)(nil)
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  // ...
}

Nếu *Handler không phù hợp với giao diện của http.Handler, câu lệnh var _ http.Handler = (*Handler)(nil) sẽ không được biên dịch.

Phía bên phải của phép gán phải là giá trị không của loại được khẳng định. Đối với các loại con trỏ (như *Handler), slice và map, đó là nil; đối với các loại cấu trúc, đó là một cấu trúc trống.

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