Pointer ke Sebuah Interface

Anda hampir tidak pernah memerlukan pointer ke jenis interface. Anda harus meneruskan interface dengan nilai, dan dengan melakukannya, data yang mendasarinya yang dilewatkan masih bisa menjadi pointer.

Interface pada dasarnya direpresentasikan dengan dua bidang pada tingkat yang mendasarinya:

  1. Sebuah pointer ke beberapa informasi tipe tertentu. Anda dapat menganggapnya sebagai "tipe".
  2. Sebuah pointer data. Jika data yang disimpan adalah pointer, maka disimpan secara langsung. Jika data yang disimpan adalah nilai, maka disimpanlah pointer ke nilai tersebut.

Jika Anda ingin metode interface untuk memodifikasi data yang mendasarinya, Anda harus menggunakan penerima pointer (menetapkan pointer objek ke variabel interface).

type F interface {
  f()
}

type S1 struct{}

func (s S1) f() {}

type S2 struct{}

func (s *S2) f() {}

// f1.f() tidak dapat memodifikasi data yang mendasarinya
// f2.f() dapat memodifikasi data yang mendasarinya, pointer objek ditugaskan ke variabel interface f2
var f1 F = S1{}
var f2 F = &S2{}

Jangan pernah menggunakan pointer ke sebuah interface, itu tidak berguna. Dalam bahasa Go, interface itu sendiri adalah tipe referensi. Dengan kata lain, tipe interface itu sendiri adalah pointer. Untuk kebutuhan saya, parameter untuk pengujian hanya perlu menjadi myinterface, dan saya hanya perlu meneruskan tipe *mystruct (dan hanya bisa meneruskan tipe *mystruct) saat melewati nilai.

type myinterface interface{
	print()
}

func test(value *myinterface){
	//sesuatu yang akan dilakukan ...
}

type mystruct struct {
	i int
}

// Implementasikan interface
func (this *mystruct) print(){
	fmt.Println(this.i)
	this.i=1
}

func main(){
	m := &mystruct{0}
test(m) // Salah
test(*m) // Salah
}