package main

import "fmt"

var simpan *int

// buatDiHeap mengembalikan alamat variabel lokal.
// Alamat x keluar dari fungsi sehingga x dipindahkan ke heap.
func buatDiHeap() *int {
	x := 42
	return &x
}

// buatDiStack hanya mengembalikan nilai.
// Nilai disalin ke pemanggil sehingga x tetap tinggal di stack.
func buatDiStack() int {
	x := 42
	return x
}

// simpanGlobal menyimpan alamat v ke variabel global.
// v ditunjuk dari luar fungsi sehingga v juga dipindah ke heap.
func simpanGlobal() {
	v := 99
	simpan = &v
}

func main() {
	p := buatDiHeap()
	simpanGlobal()
	total := *p + *simpan + buatDiStack()
	fmt.Println("total:", total)
}
