WTF*&n is Pointers in Golang (Bahasa Version)
Tags: go, pointers, indonesia
Published: 2021-12-02 06:24:55

Pointers adalah lokasi dimana data pada variabel disimpan. 

Pada dasarnya semua tipe data pointers adalah berupa long hexadecimal number yang berisi value berupa memory address dimana lokasi data disimpan, yang berarti semua tipe data pada value dari semua pointer itu sama, entah itu berasal dari integer, float, char maupun string, dan lain-lain.

## Reference

Reference adalah nilai yang tidak diakses secara langsung di tempat dimana dia dibuat namun menunjukkan lokasi dimana dia dibuat. 

Biasanya reference disimpan pada memory ataupun storage device, reference adalah sebuah alias yang menunjuk kepada sebuah pointer, setiap reference memiliki nama yang berbeda, analoginya seperti kita mencari buku berdasarkan nama penulis atau nama penerbit pada sebuah website, kita punya referensi diantara keduanya, namun akan menunjukkan buku yang kita tuju juga.

Contoh sederhananya:

```golang
package main

import (
	"fmt"
)

func main() {
  // Membuat Reference bernama names
  names := []string{"Fauzan"}
  // Membuat Reference "publisher"
  publisher := names // Menggunakan Reference "names"
  // menggunakan pointer yang sama
  fmt.Println(&names)
  fmt.Println(&publisher)
}
```

> catatan: untuk menampilkan memory address pada pointer di Golang, Anda bisa menggunakan simbol &

## Pengingat

Penggunaan pointers sangat powerful, namun dibalik "sangat powerful" tersebut terdapat ancaman, dimana penggunaan pointers adalah untuk menghindari versi copy dari sebuah variabel, sedangkan menggunakan pointer kita mengubah value yang berada pada memory address. Masalah yang dapat muncul dari penggunaan yang salah adalah memory leaks.

Untuk menghindari memory leaks pada sebuah pointer, anda cukup melakukan assign ulang pada reference lamanya dengan `nil`

```go
oldReference = nil
```

Ini mencegah memory leaks sekaligus mencegah dari meninggalkan reference lama. Melakukan assign ulang dengan value baru selain `nil` pada golang tidak akan membuat reference lama menjadi garbage collection, karena masih menjadi reference dari reference selanjutnya.

Garbage Collector pada Golang berdasarkan algoritma tri-color mark-and-sweep, dimana value pada memori akan dibebaskan jika tidak direferensikan kemanapun, dimana case disini adalah dengan menggunakan `nil`.

Seperti yang terlampir pada kode [https://go.dev/src/container/list/list.go](https://go.dev/src/container/list/list.go) :

```go
// remove removes e from its list, decrements l.len, and returns e.
func (l *List) remove(e *Element) *Element {
	e.prev.next = e.next
	e.next.prev = e.prev
	e.next = nil // avoid memory leaks
	e.prev = nil // avoid memory leaks
	e.list = nil
	l.len--
	return e
}
```

Beberapa bahasa pemrograman HLLs (High Level Languages) menyembunyikan penggunaan Pointers, salah satu contohnya adalah Javascript, mewajibkan untuk menggunakan reference, dan passing data dilakukan menggunakan copy dari reference.

## Contoh Penggunaan Pointers pada Golang

Disini saya akan memberi contoh kasus penggunaan pointers pada Golang, dimana sebuah setter method akan menggunakan , saya biasanya menggunakan contoh dengan Javascript namun karena Javascript tidak bisa menggunakan Pointers secara langsung, saya akan menggunakan Golang sebagai contohnya:

```go
package main

import (
	"fmt"
)

type Person struct {
  fullName string;
}

func (p Person) Name() string {
    return p.fullName
}

// ini tidak akan mempengaruhi reference pada fungsi main()
// karena kita hanya mengubah versi "copy" dari reference
// tersebut (person).
// func (p Person) SetName(fullName string) {
//     p.fullName = fullName
// }

// kita akan menggunakan pointer receiver untuk mempengaruhi
// reference pada fungsi main() karena dia akan menggunakan
// memory address yang sama seperti pada fungsi main()
func (p *Person) SetName(fullName string) {
    p.fullName = fullName
}

func main() {
  person := Person{}

  person.SetName("Fauzan")
  fmt.Println(person.Name())

  person.SetName("Muhammad Fauzan")
  fmt.Println(person.Name())
}
```

Jadi seperti itulah penjelasan mengenai pointers dan bagaimana contoh penggunaannya di Golang.

---

Sekian terima kasih telah membaca artikel ini, semoga bermanfaat :smile:

**References**

https://stackoverflow.com/questions/39052967/setting-pointers-to-nil-to-prevent-memory-leak-in-golang
https://www.digitalocean.com/community/conceptual_articles/understanding-pointers-in-go
https://go.dev/tour/moretypes/1