Pertemuan 6: Pointer
1. Pendahuluan: Apa itu Pointer?
Dalam pemrograman, variabel adalah tempat menyimpan data. Namun, data tersebut sebenarnya duduk di sebuah alamat fisik di dalam memori (RAM). Pointer adalah sebuah variabel yang isinya bukan data (seperti angka atau teks), melainkan alamat memori dari variabel lain.
Analogi Dunia Nyata
Jika variabel biasa adalah Rumah, maka Pointer adalah Secarik kertas berisi alamat rumah tersebut.
-
Mengubah isi rumah: Datang langsung dan ganti catnya.
-
Mengubah via pointer: Lihat alamat di kertas, datangi rumah di alamat tersebut, lalu ganti catnya.
2. Operator Dasar Pointer
Ada dua simbol keramat yang harus kalian hafal di luar kepala:
-
&(Ampersand / Address-of): Digunakan untuk mengambil alamat memori dari sebuah variabel. -
*(Asterisk / Dereferencing): Digunakan untuk mengakses atau mengubah nilai yang ada di alamat tersebut.
Contoh Dasar (Tanpa Function)
package main
import "fmt"
func main() {
nama := "Abqory" // Variabel biasa
// Kita buat pointer yang menunjuk ke alamat 'nama'
var pointerNama *string = &nama
fmt.Println("Isi variabel nama:", nama)
fmt.Println("Alamat variabel nama:", &nama)
fmt.Println("Isi dari pointerNama:", pointerNama)
// MENGUBAH DATA VIA ALAMAT (Dereferencing)
// Kita gunakan tanda bintang untuk "masuk" ke alamat tersebut
*pointerNama = "Fawwaz"
fmt.Println("Nama setelah diubah via pointer:", nama) // Output: Fawwaz
}
3. Pointer dalam Function
Secara default, Golang menggunakan sistem Pass by Value. Jika kalian mengirim variabel ke function tanpa pointer, Golang akan membuat "copy" atau duplikatnya. Perubahan di dalam function tidak akan merubah variabel asli di luar.
Solusinya? Kirim alamatnya menggunakan Pointer.
Contoh Kasus: Update Saldo Tabungan
package main
import "fmt"
func tambahSaldo(saldo *int, nominal int) {
// Kita gunakan *saldo untuk mengubah nilai di alamat aslinya
*saldo = *saldo + nominal
}
func main() {
tabungan := 100000
// Kita kirim alamatnya menggunakan simbol &
tambahSaldo(&tabungan, 50000)
fmt.Println("Total Tabungan Sekarang:", tabungan) // Output: 150000
}
4. Level Pro: Pointer Receiver Method
Dalam standar industri, kita sering menempelkan fungsi langsung ke sebuah struct (objek). Ini disebut Method. Agar method tersebut bisa mengubah isi data objek yang asli, kita wajib gunakan Pointer Receiver.
Contoh Kasus: Sistem Update Profil User
package main
import "fmt"
type User struct {
Username string
Email string
}
// Method ini 'menempel' pada User menggunakan pointer receiver (*User)
func (u *User) GantiEmail(emailBaru string) {
u.Email = emailBaru
fmt.Println("Log: Email berhasil diubah!")
}
func main() {
user1 := User{Username: "rangga_dev", Email: "lama@gmail.com"}
fmt.Println("Email Lama:", user1.Email)
// Memanggil method (Pointer diatur otomatis oleh Golang)
user1.GantiEmail("baru@gmail.com")
fmt.Println("Email Baru:", user1.Email)
}
Catatan: Menggunakan pointer pada method jauh lebih efisien memori karena komputer tidak perlu menyalin ulang seluruh data objek (struct) ke dalam fungsi.
5. Tugas Mandiri (Studi Kasus)
Judul Tugas: Sistem Manajemen Stok Toko Sederhana
Instruksi:
-
Buatlah sebuah
structbernamaProdukyang memiliki field:Nama(string),Harga(int), danStok(int). -
Buatlah sebuah Method dengan Pointer Receiver bernama
KurangiStokyang menerima parameterjumlah(int). Method ini harus mengurangi fieldStokberdasarkan jumlah yang dimasukkan. -
Buatlah sebuah Function Biasa (bukan method) bernama
DiskonProdukyang menerima parameterp *Produkdanpersen(int). Function ini harus mengubahHargaproduk tersebut setelah dipotong diskon. -
Di dalam
func main(): - Buat satu objek produk (Contoh: "Keyboard Mechanical", Harga: 500000, Stok: 10).
- Panggil method
KurangiStoksebanyak 2 unit. - Panggil function
DiskonProduksebesar 10%. - Tampilkan data produk terakhir (Nama, Stok, dan Harga).
Output yang diharapkan: Stok harus menjadi 8 dan Harga harus menjadi 450000.
Tips: Jika kalian bingung kapan pakai * dan &, ingat ini: & untuk mendapatkan alamatnya, * untuk mengolah isinya.