Go From Zero to Hero #12: Kupas Tuntas Pointer di Go — Cara Kerja Alamat Memori, Operator & dan *

Go From Zero to Hero #12: Kupas Tuntas Pointer di Go — Cara Kerja Alamat Memori, Operator & dan *

Table of Contents

Halo Go Developers! Selamat datang kembali di seri Go From Zero to Hero.

Di artikel kesebelas kemarin, kita sudah berhasil merapikan kode kita dengan konsep Fungsi (Function). Sekarang kita sudah tahu caranya memecah kode menjadi blok-blok kecil yang rapi dan bisa digunakan berulang kali (reusable).

Nah, pernah gak sih kamu terpikir: saat kita mengirimkan sebuah variabel ke dalam fungsi, apakah fungsi tersebut mengubah variabel asli kita di memori, atau cuma mengubah salinannya saja?

Secara default, Go-lang menganut prinsip Pass by Value—artinya, fungsi hanya menerima “fotocopy” dari data aslimu. Jadi, apa pun yang diutak-atik di dalam fungsi, variabel aslimu di luar fungsi akan tetap aman sentosa.

Tapi, bagaimana kalau kita benar-benar ingin mengubah nilai variabel aslinya? Di sinilah kita butuh bantuan sang “penunjuk jalan” di dunia memori komputer: Pointer!

Mendengar kata Pointer mungkin langsung membuat sebagian dari kamu keringat dingin, terutama yang punya trauma masa lalu belajar bahasa C atau C++. Tapi tenang! Di Go-lang, pointer didesain dengan sangat sederhana, aman, dan tanpa dekorasi rumit yang bikin pusing.

Yuk, siapkan segelas kopi hangat, buka teks editor favoritmu, dan mari kita bongkar misteri alamat memori ini bersama-sama!


Analogi Dunia Nyata: Alamat Rumah vs Isi Rumah

Sebelum masuk ke baris kode, mari kita samakan persepsi dulu lewat analogi super simpel ini.

Bayangkan kamu memiliki sebuah lemari brankas di rumahmu yang berisi Uang Tunai Senilai Rp10.000.000 (ini adalah Nilai / Value). Brankas ini terletak di Jalan Merdeka No. 45 (ini adalah Alamat Memori).

  • Variabel Biasa: Seperti kamu langsung menunjuk ke isi brankasnya: “Saya punya uang Rp10.000.000”.
  • Pointer: Adalah secarik kertas yang bertuliskan alamatnya: “Uang saya disimpan di Jalan Merdeka No. 45”.

Jika kamu memberikan kertas alamat tersebut kepada temanmu, temanmu bisa pergi ke alamat tersebut dan mengubah isi brankasnya (misalnya mengambil uangnya atau malah menambahkannya). Di dunia pemrograman, Pointer adalah variabel yang menyimpan ALAMAT MEMORI dari variabel lain.


Dua Operator Sakti Pointer: & dan *

Di Go-lang, kunci untuk menguasai pointer hanya ada pada dua simbol ini:

  1. Operator & (Ampersand / Reference): Digunakan untuk mencari tahu alamat memori dari sebuah variabel. (Tanya: “Brankas ini alamatnya di mana?”)
  2. Operator * (Asterisk / Dereference): Digunakan untuk melihat atau mengubah nilai yang ada di alamat memori tersebut. (Tanya: “Ada apa di dalam alamat ini?”)

Mari kita lihat contoh kodenya di Go-lang:

package main

import "fmt"

func main() {
    // 1. Variabel biasa
    angka := 10
    
    // 2. Kita buat pointer bernama "pointerAngka" yang menyimpan ALAMAT dari "angka"
    // Gunakan operator '&' untuk mengambil alamat memori
    var pointerAngka *int = &angka

    fmt.Println("Nilai dari variabel angka       :", angka)
    fmt.Println("Alamat memori dari variabel angka:", &angka)
    fmt.Println("Alamat yang disimpan di pointer  :", pointerAngka)
    
    // 3. Kita akses NILAI di dalam alamat tersebut menggunakan operator '*'
    fmt.Println("Nilai di dalam alamat pointer    :", *pointerAngka)
}

Jika kamu jalankan kodenya lewat terminal (go run main.go), hasilnya akan seperti ini:

Nilai dari variabel angka       : 10
Alamat memori dari variabel angka: 0xc000012088
Alamat yang disimpan di pointer  : 0xc000012088
Nilai di dalam alamat pointer    : 10

Catatan: Format 0xc000012088 adalah alamat memori fisik RAM di laptopmu dalam bentuk bilangan heksadesimal. Angkanya bisa berbeda-beda setiap kali program dijalankan.

Mengubah Nilai Lewat Pointer

Karena pointer memegang alamat aslinya, kita bisa mengubah isi variabel asli tanpa menyentuh variabel aslinya secara langsung. Kita cukup mengetuk “pintu” alamat memorinya menggunakan operator *.

package main

import "fmt"

func main() {
    angka := 10
    pointerAngka := &angka // Cara singkat deklarasi pointer

    fmt.Println("Nilai awal angka:", angka) // Output: 10

    // Kita ubah nilai di dalam alamat pointerAngka menjadi 99
    *pointerAngka = 99

    // Cek apakah variabel angka aslinya ikut berubah?
    fmt.Println("Nilai akhir angka:", angka) // Output: 99 (Berubah, bro!)
}

Gokil, kan? Variabel angka tidak pernah kita otak-atik langsung, tapi nilainya berubah karena kita mengubahnya langsung dari dalam “rumahnya” (alamat memorinya).

Mengapa Kita Butuh Pointer pada Fungsi?

Kembali ke masalah awal kita: Pass by Value. Mari kita lihat perbedaan fungsi biasa dengan fungsi yang memanfaatkan pointer.

Kasus 1: Fungsi Biasa (Tanpa Pointer)

package main

import "fmt"

func naikkanSatu(x int) {
    x = x + 1
}

func main() {
    nilai := 5
    naikkanSatu(nilai)
    fmt.Println("Nilai setelah fungsi dipanggil:", nilai) // Tetap 5!
}

Analisis: Fungsi naikkanSatu hanya menerima fotokopian angka 5. Variabel nilai di fungsi main tidak terpengaruh sama sekali.

Kasus 2: Fungsi dengan Pointer

package main

import "fmt"

// Kita ubah parameter agar menerima pointer (*int)
func naikkanSatuDenganPointer(x *int) {
    // Kita ubah nilai di dalam alamat memorinya langsung
    *x = *x + 1
}

func main() {
    nilai := 5
    // Kita kirim ALAMAT memorinya (&nilai)
    naikkanSatuDenganPointer(&nilai)
    
    fmt.Println("Nilai setelah fungsi dipanggil:", nilai) // Jadi 6!
}

Analisis: Karena yang kita kirim adalah alamat memorinya, fungsi naikkanSatuDenganPointer bisa langsung masuk ke RAM dan mengubah angka 5 menjadi 6.

Kesimpulan & Penutup

Selamat, Ketakutan Terbesarmu Sudah Sirna! 🧠

Sekarang kamu sudah paham bahwa pointer bukanlah hal magis yang rumit. Pointer hanyalah sebuah variabel penunjuk jalan yang bertugas mencatat alamat memori. Dengan menguasai operator & (ambil alamat) dan * (ambil/ubah nilai di alamat), kamu sudah memegang kendali penuh atas penggunaan memori RAM di program Go-lang milikmu!

Yuk, Nyicip Eksperimen Kecil! 🛠️

Coba buat dua variabel, a dan b dengan nilai masing-masing 100 dan 200. Buat pointer yang menunjuk ke variabel a, lalu ubah tujuannya agar menunjuk ke variabel b. Coba cetak nilai yang ditunjuk pointer tersebut di terminal!

🎯 Tantangan Untukmu (Challenge!)

Buatlah sebuah fungsi bernama tukarAngka(x *int, y *int). Sesuai namanya, fungsi ini harus bisa menukar nilai dari dua variabel di luar fungsi menggunakan bantuan pointer.

Contoh Alur:

a := 10
b := 20
tukarAngka(&a, &b)
// Sekarang a harus bernilai 20, dan b harus bernilai 10!

Tulis solusi kodenya di kolom komentar di bawah ya! Kalau masih bingung atau kena eror, tanyakan saja, kita bedah bareng-bareng.

Bocoran Artikel Selanjutnya 🚀

Setelah memahami cara kerja pointer dan fungsi, kini kita sudah siap melangkah ke konsep subprogram berikutnya yang tidak kalah penting di perkuliahan Alpro 2: Prosedur (Procedure).

Di artikel Go From Zero to Hero #13 selanjutnya, kita akan belajar bagaimana cara membedakan Fungsi dan Prosedur di Go, serta bagaimana implementasi parameter pointer yang baru saja kita pelajari ini di dalam sebuah Prosedur!

Sampai jumpa di artikel berikutnya, tetap semangat, dan happy coding!

Tags :
Share :
comments powered by Disqus

Related Posts

Go From Zero to Hero #04: Membuat Program Interaktif dan Mengolah Data dengan Operator Go

Go From Zero to Hero #04: Membuat Program Interaktif dan Mengolah Data dengan Operator Go

Halo Go Developers! Selamat datang kembali di seri Go From Zero to Hero. Di artikel ketiga kemarin, kita sudah berhasil memberikan “daya ingat” pada program kita lewat variabel dan tipe …

Go From Zero to Hero #09: Menguasai While-Loop dan Repeat-Until Ala Go-lang

Go From Zero to Hero #09: Menguasai While-Loop dan Repeat-Until Ala Go-lang

Halo Go Developers! Selamat datang kembali di seri Go From Zero to Hero. Di artikel ketujuh kemarin, kita sudah berhasil memberi arahan komputer untuk melakukan tugas berulang-ulang lewat satu-satunya …

Go From Zero to Hero #03: Memahami Variabel, Data, dan Tipe Data Dasar pada Go

Go From Zero to Hero #03: Memahami Variabel, Data, dan Tipe Data Dasar pada Go

Halo Go Developers! Selamat datang kembali di seri Go From Zero to Hero. Di artikel kedua kemarin, kamu berhasil membuat program Hello World dan membedah kodenya. Gimana, seru kan? Nah, kalau kemarin …