package main

import "fmt"

type Pengaturan struct {
	Nama  string
	Level int
}

// ubahSalinan menerima salinan struct dan mengembalikan salinan yang diubah.
func ubahSalinan(p Pengaturan) Pengaturan {
	p.Level = p.Level + 1
	return p
}

// ubahAsli menerima pointer dan mengubah struct milik pemanggil.
func ubahAsli(p *Pengaturan) {
	p.Level = p.Level + 1
}

func main() {
	asli := Pengaturan{Nama: "Budi", Level: 1}

	salinan := ubahSalinan(asli)
	fmt.Println("asli.Level   :", asli.Level)    // tetap 1
	fmt.Println("salin.Level  :", salinan.Level) // menjadi 2

	ubahAsli(&asli)
	fmt.Println("asli.Level setelah ubahAsli:", asli.Level) // menjadi 2

	// operator penugasan juga menyalin seluruh struct
	a := asli
	a.Level = 99
	fmt.Println("asli.Level setelah a diubah :", asli.Level) // tetap 2
}
