การตรวจสอบความมีเหตุผลของอินเทอร์เฟซ
ตรวจสอบความเอื้อต่อของอินเทอร์เฟซในขณะที่คอมไพล์ ซึ่งรวมถึง:
- การตรวจสอบประเภทที่ส่งออกซึ่งได้ทำการดำเนินการอินเทอร์เฟซพาร์ทของอินเทอร์เฟซ 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,
) {
// ...
}