ตัวชี้ไปยังอินเตอร์เฟซ

คุณเกือบไม่ต้องการตัวชี้ไปยังประเภทอินเตอร์เฟซเลย คุณควรส่งอินเตอร์เฟซโดยค่า และเมื่อทำเช่นนั้น ข้อมูลพื้นฐานที่ถูกส่งยังคงเป็นตัวชี้

ที่ระดับพื้นฐานอินเตอร์เฟซถูกแทนด้วยฟิลด์สองอย่าง:

  1. ตัวชี้ไปยังข้อมูลประเภทที่แน่นอนบางอย่าง คุณสามารถคิดเกี่ยวกับมันเป็น "ประเภท"
  2. ตัวชี้ข้อมูล หากข้อมูลที่เก็บเป็นตัวชี้ มันจะถูกเก็บโดยตรง หากข้อมูลที่เก็บเป็นค่า ตัวชี้ไปยังค่านั้นจะถูกเก็บ

หากคุณต้องการให้เมทอดอินเตอร์เฟซแก้ไขข้อมูลพื้นฐาน คุณต้องใช้ตัวรับที่เป็นตัวชี้ (กำหนดตัวชี้ของอ็อบเจ็กต์ไปยั่นตัวแปรอินเตอร์เฟซ)

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) // ไม่ถูกต้อง
}