#1 Belajar Go-Pointer
Tags: go
Published: 2021-07-30 15:44:22

### Pass By Value
Secara default pada Go-Lang variable dipassing dengan cara **pass by value**, bukan [**pass by reference**](https://golang.org/lib/godoc/images/go-logo-blue.svg), apa itu **pass by value ?.**  saat kita memindahkan variable ke method, function ,variable, dll. yang sebenarnya terjadi bukanlah memindahkan nilai sebenarnya ke tujuan ( method, function, variable, dll ), tapi yang sebenarnya terjadi adalah nilai sebenarnya diduplikasi ke tujuan.

### Pass By Reference
nilai variable yang dipindahkan merujuk pada pointer / alamat memori nilai tersebut, bukan melakukan duplikasi dari nilai tersebut dan membuat alamat memori baru.

### Pointer
Pointer adalah kemampuan untuk membuat reference ke nilai yang sudah ada tanpa melakukan dupllikasi nilai yang dipindahkan.

### Operator &
Operator **&** digunakan untuk mengambil pointer dari suatu nilai.

### Operator *
Operator * jika digunakan pada value yang akan disimpan maka akan mengembalikan pointer dari value tersebut, jika digunakan pada type variable maka menandakan bahwa variable tersebut meyimpan nilai pointer.

## Praktek

### Merubah Nilai Variable Tanpa Pointer
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9rrzke043srg9forziax.png)
> **Code (ditulis dalam Go-Lang)**

```go
package main

import "fmt"

type address struct {
	city, province, country string
}

func main() {
	// merubah nilai tanpa pointer
	address1 := address{"Padang", "Sumbar", "Indonesia"}
	address2 := address1

	address2.city = "Jakarta"

	fmt.Println(address1, " ", "ini address1")
	fmt.Println(address2, " ", "ini address2")

}
```

> **Hasil**
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pp1b6doto7b3m0o01ijn.png)

### Merubah Nilai Dengan Pointer
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n82nl7x39pbeglrv2tak.png)

> **Kode (ditulis dalam Go-Lang)**

```go
package main

import "fmt"

type student struct {
	nama  string
	grade int
}

func main() {
	student1 := student{"fariz", 10}
	var student2 *student = &student1 // menyimpan nilai pointer dari student1

	student2.grade = 12 // merubah nilai dari grade student2, ini juga akan merubah grade pada student1

	fmt.Println(student1, " ", "ini student1")
	fmt.Println(student2, " ", "ini student2")
}
```

> **Hasil**
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v1uni9dwy3f54lf4dnfe.png)

## Merubah Nilai Variable Pointer
jika merubah nilai dari variable pointer, maka hanya nilai variable itu saja yang berubah, nilai variable lain yang merujuk pada pointer variable yang sama tidak akan ikut berubah, tapi jika ingin merubah seluruh nilai variable yang merujuk pada pointer variable yang sama itu bisa dilakukan, mari lihat diagram, kode, hasil running kode dibawah ini.

> **Diagram**
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cr593g5e11do8caghjag.png)

> **Kode (ditulis dalam Go-Lang)**

```go
package main

import "fmt"

type product struct {
	name  string
	price int
}

func main() {
	product1 := product{"Sepeda", 1000}
	var product2 *product = &product1
	var product3 *product = &product1

	product2 = &product{"Motor", 5000}

	fmt.Println(product1, " ", "Nilai Masih Sama Dengan nilai product1 sebelumnya")
	fmt.Println(product2, " ", "Sudah Berubah menjadi {\"Motor\", 5000}")
	fmt.Println(product3, " ", "Nilai Masih Sama Dengan nilai product3 sebelumnya")

	println("======================================================================")

	*product2 = product{"Mobil", 10000}
	fmt.Println(product1, " ", "Sudah Berubah menjadi ", *&product1)
	fmt.Println(product2, " ", "Sudah Berubah menjadi ", *product2)
	fmt.Println(product3, " ", "Sudah Berubah menjadi", *product3)

}
```

> **Hasil**
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p1q73w23u5nu4af3on34.png)