> For the complete documentation index, see [llms.txt](https://davidwinalda94.gitbook.io/mastering-golang/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://davidwinalda94.gitbook.io/mastering-golang/pointer.md).

# Pointer

Pada sesi ini akan di bahas apa itu Pointer pada Go

Pointer adalah suatu variabel yang berisi alamat memori dari suatu nilai atau data.

Perhatikan kode di bawah ini:

![Penggunaan pointer pada variabel x](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MSNoId-OA8JkmfgH_Ix%2F-MSNtMfMsVyUYhr0qzN9%2FScreen%20Shot%202021-01-31%20at%2021.42.26.png?alt=media\&token=8799fb04-4b28-4116-9da9-0991af39759b)

![Output menampilkan nilai dan alamat memori tempat nilai tersimpan](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MSNoId-OA8JkmfgH_Ix%2F-MSNtVRpN-aSTvtGqDsc%2FScreen%20Shot%202021-01-31%20at%2021.42.40.png?alt=media\&token=e08273ac-ddca-4564-9851-1cbbc7c289c2)

Kita bisa lihat bahwa terdapat variabel `age` yang berisi nilai `26` . Lalu sebuah variabel `x` yang berisi alamat memori dari nilai variabel `age` ditandai dengan expression `&` di depan nama variabel.

{% hint style="info" %}
`age` berisi nilai 26

`x` berisi alamat memori tempat nilai `age` yaitu `26` tersimpan
{% endhint %}

Lalu bagaimana jika kita ingin mendapatkan nilai `age` dari variabel `x` atau biasa disebut dereferrencing? Kita dapat melakukannya dengan cara menggunakan expression `*` di depan variabel `x` seperti di bawah ini:

![Mengakses nilai age melalui variabel x](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MSNoId-OA8JkmfgH_Ix%2F-MSNuRxCVbFuSDbPzeeL%2FScreen%20Shot%202021-01-31%20at%2021.47.07.png?alt=media\&token=4daa22ee-e34a-450b-9f4e-16af829b9170)

![Output program menampilkan nilai dari variabel age](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MSNoId-OA8JkmfgH_Ix%2F-MSNugFIsHPxRXkYG8nu%2FScreen%20Shot%202021-01-31%20at%2021.47.21.png?alt=media\&token=d0f166a0-ab6d-4c21-9df3-9482791796cf)

### Mengubah nilai dari variabel yang mengakses suatu memori

Masih menggunakan contoh di atas, bagaimana jika kita meng-assign variabel baru pada variabel `x` ?

Variabel `x` telah memiliki keterikatan dengan variabel `age` yaitu variabel `x` berisi alamat memori dari nilai `age` . Jadi jika kita mengubah atau meng-assign nilai baru ke dalam variabel `x` maka akan mengubah juga nilai dari variabel `age` karena berada di memori yang sama.

![Melakukan perubahan nilai pada variabel x yang berpengaruh pada variabel age](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MSNoId-OA8JkmfgH_Ix%2F-MSNw5_xYWzeMuaGup6R%2FScreen%20Shot%202021-01-31%20at%2021.54.18.png?alt=media\&token=685312d7-674f-49aa-9141-8da7ae0b69ca)

![Nilai variabel x dan age menjadi 30](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MSNoId-OA8JkmfgH_Ix%2F-MSNwG7u-j98NWcRqklc%2FScreen%20Shot%202021-01-31%20at%2021.54.36.png?alt=media\&token=fe992dee-35d9-4aa8-8c2d-4b732329b386)

Pada kode di atas jika kita ingin meng-assign nilai baru pada variable Pointer, maka harus menambahkan expression `*` di depan variabel sehingga menjadi `*x = 30` .

### Menggunakan pointer dengan keyword `var`

Jika kita mendeklarasikan pointer dengan menggunakan keyword `var` ada perbedaan sedikit di penulisan sintaks:

![Deklarasi variabel pointer menggunakan keyword var](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MSNoId-OA8JkmfgH_Ix%2F-MSNyhWtFkidIK69lkTq%2FScreen%20Shot%202021-01-31%20at%2022.05.58.png?alt=media\&token=984d04dc-3f8d-4315-9a70-a0b708d9f4b7)

Untuk hasil kode di atas akan sama dengan hasil program sebelumnya. Yang perlu diperhatikan adalah saat mendeklarasikan variabel untuk di jadikan sebagai Pointer harus di tambahkan expression `*` di depan tipe data.

### Penerapan Pointer

Salah satu contoh penerapan Pointer adalah ingin mengakses data yang ada di dalam function. Pada kode di bawah ini terdapat sebuah function `change` yang mengembalikan nilai baru `new` ke nilai yang lama `old` .&#x20;

```go
package main

import (
	"fmt"
)

func main() {
	// Inisialisasi variabel number
	number := 20
	fmt.Println("Nilai variabel number sebelum memanggil function: ", number)
	fmt.Println("Alamat memori number sebelum memanggil function: ", &number)
	fmt.Println("----")

	change(number, 40)

	fmt.Println("Nilai variabel number setelah pemanggilan function", number)
	fmt.Println("Alamat memori number setelah pemanggilan function", &number)
	fmt.Println("----")
}

func change(old int, new int) {
	old = new
	fmt.Println("Nilai variabel di dalam function: ", old)
	fmt.Println("Alamat memori di dalam function: ", &old)
	fmt.Println("----")
}
```

![Output program menampilkan nilai variabel dari function main dan function change](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MSSJK2coxy0BS5zR3pF%2F-MSSbFyIQlJYK_bjQaoa%2FScreen%20Shot%202021-02-01%20at%2019.39.21.png?alt=media\&token=96e90a46-b2fc-4f91-9a1f-2fe3d6856d5a)

Untuk bisa mengakses nilai yang sama dengan yang ada di dalam function `change` , maka kita bisa menggunakan Pointer seperti berikut ini:

```go
package main

import (
	"fmt"
)

func main() {
	number := 20
	fmt.Println("Nilai variabel number sebelum memanggil function: ", number)
	fmt.Println("Alamat memori number sebelum memanggil function: ", &number)
	fmt.Println("----")
	
	// Argumen yang dikirim adalah alamat memori dari number
	change(&number, 40)

	fmt.Println("Nilai variabel number setelah pemanggilan function", number)
	fmt.Println("Alamat memori number setelah pemanggilan function", &number)
	fmt.Println("----")
}

// Untuk menampung alamat memori, harus menggunakan * pada parameter old
func change(old *int, new int) {
	*old = new
	fmt.Println("Nilai variabel di dalam function: ", *old)
	fmt.Println("Alamat memori di dalam function: ", old)
	fmt.Println("----")
}
```

![Output program mengacu pada alamat memori yang sama](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MSSJK2coxy0BS5zR3pF%2F-MSSc-TJfr-VaMVqCUZ4%2FScreen%20Shot%202021-02-01%20at%2019.43.38.png?alt=media\&token=01320332-dc87-401e-a12d-ca49e9dca5a1)
