package main

import "fmt"

// salin menerima nilai int. Perubahan hanya mengenai salinan parameter.
func salin(x int) {
	x = x + 10
}

// naikkan menerima pointer int dan menulis langsung ke variabel pemanggil.
func naikkan(x *int) {
	*x = *x + 10
}

func main() {
	nilai := 5

	salin(nilai)
	fmt.Println("setelah salin(nilai)   :", nilai) // tetap 5

	naikkan(&nilai)
	fmt.Println("setelah naikkan(&nilai):", nilai) // menjadi 15

	// new(int) mengalokasikan int baru bernilai 0 lalu mengembalikan alamatnya
	p := new(int)
	naikkan(p)
	fmt.Println("nilai *p               :", *p) // 10

	fmt.Println("p == &nilai            :", p == &nilai) // dua objek berbeda
}
