Skip to content

Go Pointer Analogy

Published: at 03:43 PM

Table of Content

Pengenalan

Mungkin kalian pernah mengalami peristiwa seperti “Bajunya bagus deh, beli dimana ya?” lalu kalian memberitahu lokasi baju tersebut dijual atau misalnya teman kalian tanya “Toilet dimana ya?” dibandingkan kalian pergi menunjukkannya kalian bisa memberitahu lokasinya saja. Hal tersebut merupakan contoh sederhana dari pointer yaitu memberikan referensi alamat.

Singkatnya, pointer merupakan variable untuk memberikan referensi alamat memori, jadi variable pointer akan menyimpan alamat memori dari variable yang dituju, misalnya dari percakapan diatas, lokasi merupakan variable pointer dan baju atau toilet merupakan variabel referensi.

Mari coba kita simak potongan kode berikut

package main

import "fmt"

func main() {
	var referensiAngka int = 60 //angka yang direferensikan
	var pointerAngka *int = &referensiAngka //deklarasi pointer dengan *, lalu assign alamat dengan &

	fmt.Println("angka yang direferensikan:", referensiAngka)
	fmt.Println("alamat angka yang direferensikan:", pointerAngka)
	fmt.Println("alamat angka yang direferensikan:", *pointerAngka)
}
output:
angka yang direferensikan: 60
alamat angka yang direferensikan: 0xc00010e010
alamat angka yang direferensikan: 60

Pointer vs Tanpa Pointer

Pointer berguna karena sifatnya yang global yaitu dapat diakses dimana saja untuk berbagi dan mengubah data yang sama tanpa membuat salinannya. Bagaimana perbedaan menggunakan dan tidak menggunakan pointer? Mari kita cek perbandingan dua kode dibawah ini

  1. Menggunakan Pointer
package main

import "fmt"

func main() {
	// diluar fungsi changeValue
	x := 10
	fmt.Println("Sebelum diubah:", x)

	changeValue(&x)

	fmt.Println("sesudah diubah:", x)
}

func changeValue(val *int) {
	*val = 20
	fmt.Println("sesudah diubah (didalam fungsi):", val)
	fmt.Println("sesudah diubah (didalam fungsi):", *val)
}
Sebelum diubah: 10
sesudah diubah (didalam fungsi): 0xc000012028
sesudah diubah (didalam fungsi): 20
sesudah diubah: 20
  1. Tanpa Pointer
package main

import "fmt"

func main() {
	// diluar fungsi changeValue
	x := 10
	fmt.Println("Sebelum diubah:", x)

	changeValue(x)

	fmt.Println("sesudah diubah:", x)
}

func changeValue(val int) {
	val = 20
	fmt.Println("sesudah diubah (didalam fungsi):", val)
}
Sebelum diubah: 10
sesudah diubah (didalam fungsi): 20
sesudah diubah: 10

Jadi dari perbandingan kedua kode tersebut, menggunakan pointer lebih safety dan efisien untuk menyalin suatu data dan alamatnya.


Karakteristik Pointer

Variable pointer memiliki tanda * saat deklarasinya, ditaruh tepat sebelum penulisan tipe data, seperti pada kode berikut ini

var a *string

Pointer memiliki nilai default yaitu nil dan tidak bisa menampung nilai yang bukan pointer, seperti pada contoh kode berikut ini

package main

import "fmt"

func main() {
	var x string = "aku"
	var y *string = x
	fmt.Println(x)
	fmt.Println(y)
}
output:
./prog.go:7:18: cannot use x (variable of type string) as *string value in variable declaration

Cara melakukan referencing pada pointer yaitu dengan menggunakan tanda ampersand (&), lalu untuk mengambil nilai asli pointer digunakan asterisk (*) pada variable pointernya, seperti pada kode berikut ini

package main

import "fmt"

func main() {
	var x string = "aku"
	var y *string = &x
	fmt.Println(x)
	fmt.Println("address dari variable x:", y)
	fmt.Println("nilai asli dari variable x:", *y)
}
package main

import "fmt"

func main() {
	var x string = "aku"
	var y *string = &x
	fmt.Println(x)
	fmt.Println("address dari variable x:", y)
	fmt.Println("nilai asli dari variable x:", *y)
}

Referensi