ตัวชี้ไปยังอินเตอร์เฟซ
คุณเกือบไม่ต้องการตัวชี้ไปยังประเภทอินเตอร์เฟซเลย คุณควรส่งอินเตอร์เฟซโดยค่า และเมื่อทำเช่นนั้น ข้อมูลพื้นฐานที่ถูกส่งยังคงเป็นตัวชี้
ที่ระดับพื้นฐานอินเตอร์เฟซถูกแทนด้วยฟิลด์สองอย่าง:
- ตัวชี้ไปยังข้อมูลประเภทที่แน่นอนบางอย่าง คุณสามารถคิดเกี่ยวกับมันเป็น "ประเภท"
- ตัวชี้ข้อมูล หากข้อมูลที่เก็บเป็นตัวชี้ มันจะถูกเก็บโดยตรง หากข้อมูลที่เก็บเป็นค่า ตัวชี้ไปยังค่านั้นจะถูกเก็บ
หากคุณต้องการให้เมทอดอินเตอร์เฟซแก้ไขข้อมูลพื้นฐาน คุณต้องใช้ตัวรับที่เป็นตัวชี้ (กำหนดตัวชี้ของอ็อบเจ็กต์ไปยั่นตัวแปรอินเตอร์เฟซ)
type F interface {
f()
}
type S1 struct{}
func (s S1) f() {}
type S2 struct{}
func (s *S2) f() {}
// f1.f() ไม่สามารถแก้ไขข้อมูลพื้นฐาน
// f2.f() สามารถแก้ไขข้อมูลพื้นฐาน, ตัวชี้ของอ็อบเจ็กต์ถูกกำหนดไปยั่นตัวแปรอินเตอร์เฟซ f2
var f1 F = S1{}
var f2 F = &S2{}
อย่าเคลียร์ตัวชี้ไปยังอินเตอร์เฟซเลย มันไม่มีความหมาย ใน Go language, อินเตอร์เฟซเองเป็นประเภทอ้างอิง กล่าวคือ ประเภทอินเตอร์เฟซเองเป็นตัวชี้ สำหรับควา needs ของฉัน พารามิเตอร์ที่ใช้ในการทดสอบเพียงอย่างเดียวที่ต้องการจะเป็น myinterface และฉันเพียงต้องการส่งประเภท *mystruct (และสามารถส่งเฉพาะประเภท *mystruct ได้เท่านั้น) เมือส่งค่า
type myinterface interface{
print()
}
func test(value *myinterface){
//someting to do ...
}
type mystruct struct {
i int
}
// Implement the interface
func (this *mystruct) print(){
fmt.Println(this.i)
this.i=1
}
func main(){
m := &mystruct{0}
test(m) // ไม่ถูกต้อง
test(*m) // ไม่ถูกต้อง
}