← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 18

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`.