Golang – Pointer

Pointer adalah sebuah tipe variable yang digunakan untuk menyimpan alamat dari sebuah nilai dari data type (pointer juga disebut sebagai referencing). Nilai dari variable pointer adalah sebuah alamat memory didalam komputer yang berupa angka hexa. Untuk membuat variable pointer kita gunakan * dan untuk mendapatkan alamat memory dari sebuah variable atau value menggunakan &. Perhatikan contoh berikut :

Langsung saya jelaskan mengenai kode diatas :

  • line 2 : variable a bertipe int32 didefinisikan dan diberi nilai 20. Ketika kita mendefinisikan variable otomatis variable tersebut akan miliki tempat di memory RAM (memiliki alamat di RAM) dan besarnya memory yang dipakai di RAM tergantung dengan ukuran dari tipe datanya.
  • line 3 : variable b bertipe pointer to int32, artinya variable b akan berisi alamat memory dari sebuah nilai bertipe int32. Dalam contoh nilai dari b diisi alamat memory dari a (yaitu dengan &a).
  • line 4 : print alamat memory yang ditunjuk oleh b, yaitu alamat dari variable a dan merupakan nilai hexa. Nilai ini adalah alamat didalam memory dan nilai ini akan berubah-ubah sesuai dengan memory yang di pakai oleh variable tersebut.
  • line 6 : print dari nilai yang ditunjuk oleh b (deference). Untuk mendapatkan nilai dari sebuah alamat memory, kita gunakan * seperti pada contoh diatas.
  • line 7 : saya mengubah nilai didalam memory yang ditunjuk oleh variable b (yaitu a) dengan nilai 78. Ketika kita print maka nilai a dan nilai yang ditunjuk oleh b sama, karena memang mengarah pada alamat memory yang sama.
  • line 10 : sama halnya dengan line 7 diatas.

Inisialisasi variable pointer

Variable pointer dapat diinisialisasi dengan beberapa cara, yaitu sebagai berikut :

new dapat digunakan untuk menginisialisasi variable pointer. New digunakan hanya untuk inisialisasi kosongan, tidak dapat langsung diisi seperti pada line 6 kode diatas.

Selanjutanya apa sih kegunaan dari pointer disini? Dalam beberapa hal pointer akan lebih irit memory dan jalan lebih cepat. Karena dalam penggunaannya pointer dilempar dari 1 variable ke variable lain atau dari fungsi ke fungsi hanya alamat memorynya saja. Dimana untuk menyimpan alamat memory hanya dibutuhkan 4byte (untuk mesin 32bit) dan 8 byte (untuk mesin 64bit). Mungkin kalau variable yang kita reference hanya sebuah int atau float tidak begitu berpengaruh, namun jika yang kita reference adalah sebuah struct yang miliki banyak variable didalamnya, ini akan sangat berperngaruh sekali. Contoh paling nyata adalah dalam penggunaan fungsi, yaitu pass by value dan pass by reference.


Pass by value

Perhatikan contoh di bawah ini.

Mari saya jelaskan dari fungsi main :

  • line 12 : saya membuat struct Rumah, dan variable ini akan disimpan di memory (besaran dari memory tergantung dari type data dan banyak nya variable di dalam struct tersebut).
  • line 13 : saya print alamat dari variable rm. (ingat nilai ini akan berubah-ubah).
  • line 14 : saya panggil printInfoRumah dengan pass by value. Maksutnya pass by value adalah saya mengopy seluruh isi dari struct rm ke variable baru bernama rumah pada line 17.
  • line 15 : saya print alamat dari rumah dan nilai nya berbeda dengan alamat rm. Ini terjadi karena pass by reference yang artinya variable rumah pada fungsi printInfoRumah merupakan variable baru dan isinya hasil copy dari variable rm.

Seperti kita ketahui disini pass by reference akan membutuhkan lebih banyak memory dan waktu eksekusi lebih lama karena program perlu membuat variable baru rumah di memory dan mengopi semua isi dari variable rm ke rumah.

Namun walupun demikian, ada sedikit keuntungan dari pass by value yaitu ketika kita mengedit isi dari variable rumah pada fungsi printInfoRumah, tidak akan mengubah isi dari variable rm, karena mereka memiliki alamat yang berbeda pada memory.


Pass by Reference

Mari kita edit contoh diatas dan membuatnya menjadi pass by reference.

Untuk mengubah fungsi menjadi pass by reference kita dapat mengubah parameternya menjadi bertipe pointer. Dan berikut penjelasannya :

  • line 14 : saya memanggil fungsi printInfoRumah dengan &rm sebagai paramaternya, karena printInfoRumah memerlukan parameter bertipe pointer.
  • line 18 : ketika saya print alamat pointer dari rumah, maka alamat memorynya sama dengan alamat memory dari rm. Maka disini tidak ada pembuatan variable baru, maka akan lebih hemat memory dan waktu juga.

Namun perlu hati-hati, karena rm dan rumah memiliki alamat yang sama, maka ketika kita mengedit value dari rumah pada fungsi printInfoRumah maka secara tidak langsung kita juga mengedit variable rm.

Jika kita analogikan ke dunia nyata, pass by reference adalah kita proses value dari alamat rumah tersebut, jadi kita hanya memainkan alamatnya saja tanpa membuat rumah baru. Dan pass by value artinya kita membuat rumah baru yang sama dengan rumah yang asli, dimana rumah baru tersebut memiliki alamat yang berbeda dengan rumah yang asli, yang artinya membuat rumah baru akan boros tempat dan waktu.

Golang tutorial index

4 thoughts on “Golang – Pointer

Leave a Reply

Your email address will not be published. Required fields are marked *