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?
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?
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:
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:
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.
Terima kasih untuk artikelnya, Mas!