Go pointer

wahyu eko hadi saputro
3 min readMay 1, 2021

--

Ok temans saat ini akan dibahas sekilas tentang go pointer. Berikut adalah gambar untuk pengertian sekilas tentang pointer, soalnya jika pakai tulisan aku masih agak bingung menjelaskannya.

Variable panjang memiliki alamat memori AAAAA1 dengan nilai FFFFF1 yang mana FFFFF1 adalah memory address / alamat memori yang memiliki nilai 10. Jadi variable panjang adalah sebuah pointer, karena nilai variable panjang adalah sebuah alamat memori yaitu FFFFF1.

Sebelum mengkoding lebih jauh, pertama harus memahami beberapa notasi / simbol yang perlu dipahami untuk bahasa pemrograman golang.

  • & adalah simbol reference, yaitu simbol untuk mengambil alamat memori sebuah variabel.
  • * adalah simbol yang memiliki 2 definisi / kegunaan :
  1. sebagai operator untuk menandakan bahwa tipe variable adalah pointer.
 var nama *string

2. Sebagai dereference pointer variable, dereference berarti untuk mengakses nilai dari alamat memori yang direference oleh pointer variable. berikut adalah contoh mengganti / meng-assign ulang pointer variable dengan nilai yang lain sekalis mencetak nilai yang baru tersebut.

*nama = “new”

fmt.Println(*nama)

Contoh cara menggunakan pointer pada golang

var bilangan1 int = 10var pointerVar1 *int = &bilangan1fmt.Println(pointerVar1)fmt.Println(*pointerVar1)Projects/test-project$ go run test.go0xc0000140c010

Deklarasi var pointerVar1 *int = &bilangan1 bisa juga dilakukan dengan var pointerVar1 = &bilangan1 atau var pointerVar1 := &bilangan1.

  • sintak &bilangan1 adalah perintah untuk mendapatkan alamat memori variabel bilangan1.
  • var pointerVar1 *int adalah sintak untuk menandakan bahwa variable pointerVar1 adalah variabel pointer, hal ini dutunjukkan dengan adanya operator * pada tipe int.
  • sintak fmt.Println(pointerVar1) akan memunculkan alamat memori yang disimpan oleh variable pointerVar1 yaitu alamat memori variable bilangan1, dan jika ingin memunculkan nilai aslinya kasih tanda * pada variablenya contoh fmt.Println(*pointerVar1).
func ubahNilai(pointerVar *int) {    *pointerVar = 11}func main() {   var bilangan1 int = 10   var pointerVar1 *int = &bilangan1   fmt.Println(pointerVar1)   fmt.Println(*pointerVar1)   ubahNilai(pointerVar1)   fmt.Println(“=============”)   fmt.Println(pointerVar1)   fmt.Println(*pointerVar1)}Projects/test-project$ go run test.go0xc0000140c010=============0xc0000140c011

Pada kodingan diatas, akan membahas proses meng-assign nilai baru pada pointer variabel. Untuk meng-assign harus menggunakan simbol * pada nama variablenya atau disebut juga dereference contoh

*pointerVar = 11 

prosesnya adalah :

misal pointerVar1 merujuk ke alamat memory AAA1 dengan nilai 10, selanjutnya panggil fungsi ubahNilai maka nilai pointerVar adalah copy dari variable pointerVar1 yang mana adalah merujuk ke alamat memory AAA1 dengan nilai 10. Kemudian alamat memory AAA1 itu nilainya diubah menjadi 11, yang mengakibatkan semua variable yang merujuk ke reference alamart memory AAA1 akan memiliki nilai 11.

Kunikan call method golang dengan pointer

Kemudian satu lagi yang agak unik pointer di golang, sebenarnya golang itu lempar variable pointer ke sebuah method / procedure by value, jadi ya mirip seperti mengkopi data, berikut ilustrasinya :

import "fmt"func ubahNilai(pointerVar *int) {
var tempInt int = 4
pointerVar = &tempInt
}
func main() {
var bilangan1 int = 10
var pointerVar1 *int = &bilangan1
fmt.Println(*pointerVar1)
ubahNilai(pointerVar1)
fmt.Println("=============")
fmt.Println(*pointerVar1)
}

pada contoh diatas perubahan nilai menjadi 4 tidak akan berpengaruh pada variable di luar method, karena pada dasarnya dia call by value. misalnya:

pointerVar1 merujuk ke alamat memory AAA1 dengan nilai 10

setelah dilempar pointernya ke method ubahNilai maka :

nilai var pointerVar dalam method adalah copy dari pointerVar1 yang mana adalah merujuk ke alamat memory AAA1 dengan nilai 10. kemudian anggap nilai tempInt merujuk ke alamat memory AAA2 dengan nilai 4. kemudian variabel pointerVar di assign dengan variabel tempInt yang merujuk ke alamat memory AAA2 dengan nilai 4, jadi nilai dari pointerVar di timpa menjadi merujuk ke alamat memory AAA2. kurang lebih begitu ilustrasinya, keadaan real proses di memory pasti lebih komplek

Sumber :

https://golangdocs.com/pointers-in-golang

--

--

No responses yet