Pointer
Alamat memori, & dan *, serta kapan memakai pointer.
Setiap variable punya alamat
Variable disimpan di memori pada suatu alamat. Operator & mengambil alamat sebuah variable, dan * mengikuti alamat untuk membaca atau mengubah isinya.
x := 10
p := &x // p bertipe *int, berisi alamat x
fmt.Println(*p) // 10 (membaca lewat pointer)
*p = 20 // mengubah x lewat pointer
fmt.Println(x) // 20
&x→ "alamat x"*p→ "isi yang ditunjuk p" (dereference)*int→ tipe "pointer ke int"
Kenapa penting? Argumen disalin
Go selalu mengirim argumen sebagai salinan:
func tambah(n int) {
n++ // hanya mengubah salinan
}
x := 10
tambah(x)
fmt.Println(x) // tetap 10
Untuk mengubah variable asli, kirim pointer:
func tambahP(n *int) {
*n++
}
tambahP(&x)
fmt.Println(x) // 11
nil pointer
Pointer tanpa alamat bernilai nil. Membaca *p saat p == nil menyebabkan panic. Selalu periksa jika pointer bisa kosong.
new
new(int) membuat variable int baru dan mengembalikan pointernya (jarang dipakai; biasanya &x atau &Struct{}).
Pointer ke struct
Go memudahkan: p.Nama otomatis dipahami sebagai (*p).Nama.
Kapan memakai pointer?
- Function perlu mengubah data pemanggilnya.
- Data besar (struct besar) — menyalin mahal.
- Menandai "nilai opsional" (
nilberarti tidak ada).
Selain itu, nilai biasa lebih sederhana dan aman. Go tidak punya aritmatika pointer seperti C, sehingga jauh lebih aman.