Receiver sering sekali dipakai di golang. Catatan ini berisi penjelasan se-simple mungkin tentang receiver dan cara menggunakannya.

Tapi sebelum membahas receiver, kita akan singgung dulu hal yang sangat berkaitan: function dan method.

Function

Ini adalah contoh sebuah fungsi di golang:

func add(x int, y int) int {
	return x + y
}

Kode lengkapnya: lihat di sini.

Fungsinya sangat sederhana: hanya mengembalikan penjumlahan 2 integer.

Method

Method sebenarnya adalah sebuah function juga. Hanya saja ia melekat pada sebuah struct.

Berikut ini adalah contoh sebuah struct yang ditempelin oleh sebuah method add().

type box struct {
	x, y int
}

func (v box) add() int {
	return v.x + v.y
}

Receiver

Receiver adalah argumen spesial yang digunakan sebuah struct untuk membuat fungsi agar melekat padanya.

Tanpa ada receiver, tak ada method.

Lihat kode method di atas, perhatikan bagian ini:

func (v box) add() int {
	return v.x + v.y
}

Dalam hal ini, (v box), adalah receiver.

Dan dengan adanya receiver, method-method dapat diakses dengan cara seperti ini:

func main() {
	v := box{3, 4}
	result := v.add()
	fmt.Println(result)
}

Kode lengkapnya: lihat di sini.

Pointer receivers

Seperti telah kita ketahui, pointer dapat kita gunakan untuk mengakses alamat suatu variabel.

Apa yang terjadi jika pointer kita gunakan untuk receiver?

type box struct {
	x, y int
}

func (v *box) add() int {
	return v.x + v.y
}

Kode lengkapnya: lihat di sini.

Ternyata tidak ada yang terjadi.

Mari tambahkan satu fungsi yang bertujuan untuk mengubah variabel di dalam struct.

Kita tidak pakai pointer dulu, ya. Biar tahu apa bedanya.

type box struct {
	x, y int
}

func (v box) add() int {
	return v.x + v.y
}

func (v box) scale(s int) {
	v.x = v.x * s
	v.y = v.y * s
}

Kode lengkapnya: lihat di sini.

Ternyata tidak ada yang terjadi. Variabel x dan y dalam fungsi scale hanya menerima copi-an datanya saja. Nilai variabel dalam struct-nya sendiri tidak berubah.

Mari kita ganti spesial argumen di atas menggunakan pointer.

type box struct {
	x, y int
}

func (v *box) add() int {
	return v.x + v.y
}

func (v *box) scale(s int) {
	v.x = v.x * s
	v.y = v.y * s
}

Kode lengkapnya: lihat di sini.

Ternyata hasilnya berubah. Variabel x dan y dalam pointer telah sukses diganti oleh method scale.

Hal itu bisa terjadi karena yang diakses method tersebut adalah alamat variabel-variabel x dan y.

Sehingga saat alamat-alamat tersebut dikalikan 2, data-data di alamat tersebut akan ikut berubah.