Method receiver di Go mirip dengan metode pada beberapa bahasa pemrograman berbasis objek. Namun, penulisan sintaksis di Go berbeda dengan bahasa pemrograman berbasis objek lainnya.
Kesalahan yang sering terjadi saat menggunakan method receiver adalah tidak memahami perbedaan antara value receiver dan pointer receiver pada struct. Ada dua istilah penting di Go:
- Value Receiver
- Pointer Receiver
Value Receiver
Value Receiver membuat salinan (copy) dari data yang dilewatkan ke method. Artinya, perubahan yang dilakukan pada data di dalam method tidak akan memengaruhi data asli di luar method, karena yang dimodifikasi hanyalah salinannya.
Contoh penggunaan value receiver:
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
}
func (p Person) ChangeName(name string) {
p.Name = name
}
func main() {
person := Person{"Rizki", 19}
fmt.Println("Sebelum diubah:", person)
person.ChangeName("Asep")
fmt.Println("Setelah diubah:", person)
}
Output:
Sebelum diubah: {Rizki 19}
Setelah diubah: {Rizki 19}
Pada contoh di atas, method ChangeName
tidak mengubah data asli karena menggunakan value receiver (p Person
). Perubahan hanya terjadi pada salinan struct di dalam method.
Jika kita tambahkan debug di dalam method:
func (p Person) ChangeName(name string) {
p.Name = name
fmt.Println("Perubahan di dalam fungsi ChangeName():", p)
}
Output:
Sebelum diubah: {Rizki 19}
Perubahan di dalam fungsi ChangeName(): {Asep 19}
Setelah diubah: {Rizki 19}
Terlihat bahwa perubahan hanya terjadi pada salinan struct di dalam method, bukan pada data aslinya.
Pointer Receiver
Pointer Receiver menggunakan pointer ke struct sebagai receiver-nya. Dengan cara ini, method dapat mengubah data asli dari struct, karena method bekerja langsung pada alamat memori struct tersebut.
Contoh penggunaan pointer receiver:
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
}
func (p *Person) ChangeName(name string) {
p.Name = name
}
func main() {
person := Person{"Rizki", 19}
fmt.Println("Sebelum diubah:", person)
person.ChangeName("Asep")
fmt.Println("Setelah diubah:", person)
}
Output:
Sebelum diubah: {Rizki 19}
Setelah diubah: {Asep 19}
Pada contoh di atas, method ChangeName
berhasil mengubah data asli karena menggunakan pointer receiver (p *Person
). Perubahan yang dilakukan di dalam method langsung memengaruhi data asli.
Kapan Menggunakan Value Receiver dan Pointer Receiver?
Value Receiver cocok digunakan jika:
- Method tidak mengubah data struct.
- Struct berukuran kecil sehingga overhead copy tidak signifikan.
- Ingin memastikan data struct tetap immutable di dalam method.
Pointer Receiver cocok digunakan jika:
- Method perlu mengubah data struct.
- Struct berukuran besar sehingga menghindari overhead copy.
- Ingin konsistensi method set (Go tidak mengizinkan method dengan receiver campuran pada interface).
Kesimpulan
- Gunakan value receiver jika tidak ingin memodifikasi data struct.
- Gunakan pointer receiver jika ingin mengubah atau memodifikasi data struct.
- Memahami perbedaan ini sangat penting agar program Go berjalan sesuai harapan dan efisien dalam penggunaan memori.
Referensi: