Pointer
Alamat memori variabel dan mengubah nilai dari fungsi lain.
Pahami konsepnya
Pointer menyimpan alamat memori variabel lain. Operator & mengambil alamat sebuah variabel (&skor), tanda * pada tipe (*int) menyatakan "pointer ke int", dan tanda * pada variabel pointer (*poin) membaca atau menulis nilai yang tersimpan di alamat itu.
Secara bawaan Go menyalin nilai saat argumen dikirim ke fungsi — perubahan di dalam fungsi tidak menyentuh variabel aslinya. Dengan menerima pointer, fungsi bekerja langsung pada variabel sungguhan milik pemanggil, sehingga perubahannya menetap. Sifat ini juga membuat struct besar lebih hemat dikirim sebagai pointer daripada disalin utuh.
Go sengaja tidak menyediakan aritmatika pointer seperti C — pointer di sini aman: tidak bisa dijumlah atau digeser, hanya menunjuk atau nil. Operator & dan * menjadi fondasi method dengan pointer receiver serta penerusan struct antar fungsi secara efisien.
Coba contoh kode
package main
import "fmt"
func naikkan(poin *int) {
*poin += 10
}
func main() {
skor := 70
naikkan(&skor)
fmt.Println(skor)
}naikkan(&skor) mengirim alamat skor, lalu *poin += 10 menambah 10 pada nilai yang tersimpan di alamat tersebut — hasilnya 80. Hilangkan & dan * lalu jalankan ulang: cetakannya tetap 70 karena fungsi hanya mengubah salinannya. Kontras kecil ini adalah inti terpenting dari pointer.
Pointer pada struct
type Titik struct{ X, Y int }
func geser(t *Titik, dx, dy int) {
t.X += dx // singkat: (*t).X boleh ditulis t.X
t.Y += dy
}
func main() {
posisi := Titik{X: 2, Y: 3}
geser(&posisi, 5, -1)
fmt.Println(posisi) // {7 2}
}Field lewat pointer struct diakses langsung dengan tanda titik — Go otomatis melakukan (*t).X. Kemudahan kecil ini membuat kode pointer di Go terasa hampir seperti kode biasa.
Latihan singkat
Uji: lengkapi tukar lewat pointer — program harus mencetak persis `2 1`.