Skip to content

Instantly share code, notes, and snippets.

@ynwd
Last active September 10, 2021 06:42
Show Gist options
  • Save ynwd/c33676c5b31ad53d74375a15c11631ae to your computer and use it in GitHub Desktop.
Save ynwd/c33676c5b31ad53d74375a15c11631ae to your computer and use it in GitHub Desktop.
Golang Pointer Simplified

Golang Pointer

Diadaptasi dari artikel berikut.

Perhatikan variabel-variable di kode berikut:

package main

import "fmt"

type People struct {
	Name string
	Age  int
}

func main() {
	var age int = 4
	var name string = "pram"
	var people = People{"Pram", 4}
}

Untuk menggunakan variabel, kita tinggal memanggil saja namanya.

Perhatikan kode berikut:

fmt.Println(age)
fmt.Println(name)
fmt.Println(people.Age)
fmt.Println(people.Name)

Sebenarnya, setiap variable yang ditulis diatas, oleh komputer disimpan di memori dengan memory address (alamat) tertentu.

Lihat gambar berikut:

Variable age di address 0x3231
Variable name di address 0x3234
Variable people di address 0x3238

Yang jadi pertanyaan:

  • Bagaimana cara kita mendapatkan address variabel-variabel tersebut?

Cara mendapatkan address

Caranya sangat gampang. Kita tinggal menambahkan simbol & (address operator) sebelum nama variabel.

Perhatikan kode berikut:

fmt.Println(&age)
fmt.Println(&name)
fmt.Println(&people)

Yang jadi pertanyaan:

  • Bagaimana cara kita menyimpan address?

Tipe data untuk menyimpan address

Nah, inilah kegunaan pointer: tipe data yang digunakan untuk penyimpanan address dalam sebuah variabel.

Cara deklarasinya cukup menambahkan simbol * sebelum tipe data.

Perhatikan kode berikut:

var agePointer *int
var namePointer *string
var peoplePointer *People

agePointer = &age
namePointer = &name
peoplePointer = &people

Karena kecerdasan Golang, kode diatas bisa dipersingkat dengan cara berikut:

agePointer := &age
namePointer := &name
peoplePointer := &people

Jika langsung memanggil variabel-variabel pointer tersebut, yang kita dapatkan adalah memory address.

Perhatikan kode berikut:

fmt.Println(agePointer)
fmt.Println(namePointer)
fmt.Println(peoplePointer)

Hasilnya seperti ini:

0x3231
0x3234
&{Pram 4}

Perhatikan gambar berikut untuk mengetahu secara visual apa yang terjadi di memori:

Mendapatkan data dengan pointer

Yang menarik adalah, kita bisa mendapatkan data "asal" hanya dengan menambahkan symbol * di depan nama variabel tersebut.

Coba lihat kode berikut:

fmt.Println(*agePointer)
fmt.Println(*namePointer)
fmt.Println(*peoplePointer)

Hasilnya:

4
pram
{Pram 4}

Perhatikan gambar berikut:

Kegunaan pointer

Perhatikan kode berikut:

var people1 People
var people2 People
var people3 People

people1 = People{"pram",4}
people2 = people1
people3 = people2

fmt.Println(people3)

Di golang, semua hal itu passed by value. Oleh karena itu, semua variabel diatas akan dicopy mentah-mentah dan dibuatkan space dan alamatnya di memori.

Bayangkan ada ribuan variabel seperti people, akan seperti apa kondisi memorinya? Tentu akan cepat penuh, bukan? Ini akan berakibat lambatnya pemrosesan.

Nah, karena pointer hanya menyimpan alamat memori, tentu saja ruang yang dipakai untuk menyimpan data tetap minimal.

What’s next:

@izznfkhrlislm
Copy link

Terima kasih untuk artikelnya, Mas!

@ynwd
Copy link
Author

ynwd commented Nov 19, 2020

Terima kasih untuk artikelnya, Mas!

sama-sama

@nandafir
Copy link

merasuk banget penjelasannya, mudah dipahami
Thanks banget mas

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment