มีคำตอบที่ดีอยู่แล้วที่นี่ ให้ฉันเพิ่มของฉันเองด้วยสำหรับคนอื่น ๆ ที่ต้องการเข้าใจโดยสัญชาตญาณ:
อินเตอร์เฟซ
นี่คืออินเทอร์เฟซด้วยวิธีการเดียว:
type Runner interface {
Run()
}
ดังนั้นทุกประเภทที่มีRun()
วิธีการตรงตามอินเทอร์เฟซ Runner:
type Program struct {
}
func (p Program) Run() {
}
func (p Program) Stop() {
}
อินเทอร์เฟซว่างเปล่า
นี่คืออินเทอร์เฟซว่างเปล่าที่มีชื่อโดยไม่มีวิธีการใด ๆ :
type Empty interface {
}
ดังนั้นทุกประเภทก็ตรงตามอินเทอร์เฟซนี้ เนื่องจากไม่จำเป็นต้องใช้วิธีใดเพื่อตอบสนองอินเทอร์เฟซนี้ ตัวอย่างเช่น:
var a Empty
a = 5
a = 6.5
a = "hello"
แต่โปรแกรมประเภทด้านบนตอบสนองหรือไม่ ใช่:
a = Program{}
อินเทอร์เฟซ {} เท่ากับอินเทอร์เฟซว่างเปล่าด้านบน
var b interface{}
b = a
b = 9
b = "bye"
อย่างที่คุณเห็นไม่มีอะไรลึกลับเกี่ยวกับเรื่องนี้ แต่มันง่ายมากที่จะละเมิด อยู่ห่างจากมันให้มากที่สุด
https://play.golang.org/p/A-vwTddWJ7G
interface{}
มากหรือน้อยเทียบเท่ากับvoid *
ใน C มันสามารถชี้ไปที่อะไรก็ได้และคุณต้องมีการยืนยันการร่าย / ประเภทเพื่อใช้งาน