package main

import "fmt"

type Counter struct {
	Total int
}

// naikNilai memakai value receiver: method menerima salinan struct.
func (c Counter) naikNilai() {
	c.Total = c.Total + 1 // hanya mengubah salinan
}

// Naik memakai pointer receiver: method menerima alamat struct asli.
func (c *Counter) Naik() {
	c.Total = c.Total + 1 // mengubah milik pemanggil
}

func main() {
	c := Counter{Total: 0}

	c.naikNilai()
	c.naikNilai()
	fmt.Println("setelah naikNilai 2x:", c.Total) // tetap 0

	c.Naik()
	c.Naik()
	fmt.Println("setelah Naik 2x     :", c.Total) // menjadi 2

	p := &c
	p.Naik()                                      // pointer memanggil method pointer receiver secara langsung
	fmt.Println("setelah p.Naik()    :", c.Total) // menjadi 3
}
