การตรวจสอบความมีเหตุผลของอินเทอร์เฟซ

ตรวจสอบความเอื้อต่อของอินเทอร์เฟซในขณะที่คอมไพล์ ซึ่งรวมถึง:

  • การตรวจสอบประเภทที่ส่งออกซึ่งได้ทำการดำเนินการอินเทอร์เฟซพาร์ทของอินเทอร์เฟซ 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,
) {
  // ...
}