Pointers
#
// Go က pointers တွေကို support လုပ်ပါတယ်။
// Go မှာ pointer ဆိုတာက variable တစ်ခုရဲ့ memory address ကို သိမ်းထားတဲ့ variable လို့ နားလည်နိုင်ပါတယ်။
// Pointer ကိုသုံးပြီးတော့ variable ကို တိုက်ရိုက်တန်ဖိုးမပြင်ဘဲ သွယ်ဝိုက်ပြီး access လုပ်နိုင်ပါတယ်။
// Pointer တွေက variable တစ်ခုကို copy မလုပ်ဘဲ reference ကို pass လုပ်ချင်တဲ့အခါမှာ အသုံးဝင်ပါတယ်။
package main
import "fmt"
// pointer နဲ့ value သုံးတာ ဘာကွာခြားလဲဆိုတာကို ပြဖို့အတွက် zeroval ဆိုတဲ့ function နဲ့
// zeroptr ဆိုတဲ့ function တွေကို သုံးပြီး ရှင်းပြပါမယ်။ zeroval function က
// `int` parameter ကို လက်ခံပါတယ်။ ဒီမှာ ကျွန်တော်တို့က parameter မှာ value ထည့်ပေးလိုက်ပါတယ်။
// zeroval function က ival ရဲ့ copy ကို ရရှိပါတယ်။ ဒီ copy က သူ့ကိုခေါ်တဲ့
// function ထဲက ကောင်နဲ့ မတူဘူးဆိုတာကို သတိထားပါ။
func zeroval(ival int) {
ival = 0
}
// zeroptr function ကတော့ `*int` parameter ရှိပါတယ်။ ဆိုလိုတာက
// သူက `int` pointer ကို လက်ခံတယ်လို့ ဆိုလိုပါတယ်။ function ထဲမှာရှိတဲ့ `*iptr` code က
// pointer ကို သူ့ရဲ့ memory address ကနေ လက်ရှိတန်ဖိုးဆီကို *dereference* လုပ်ပါတယ်။
// Dereference လုပ်ထားတဲ့ pointer ကို တန်ဖိုးသတ်မှတ်ပေးခြင်းဟာ
// ညွှန်းထားတဲ့ address မှာရှိတဲ့ တန်ဖိုးကို ပြောင်းလဲစေပါတယ်။
func zeroptr(iptr *int) {
*iptr = 0
}
func main() {
i := 1
fmt.Println("initial:", i)
zeroval(i)
fmt.Println("zeroval:", i)
// `&i` syntax က `i` ရဲ့ memory address ကိုပေးပါတယ်။
// တနည်းအားဖြင့် `i` ရဲ့ pointer ပါ။
zeroptr(&i)
fmt.Println("zeroptr:", i)
// Pointer တွေကို Print ထုတ်ကြည့်လို့ရပါတယ်။
fmt.Println("pointer:", &i)
}
# `zeroval` က `main` ထဲက `i`
# ကို မပြောင်းလဲစေပါဘူး၊ ဒါပေမယ့်
# `zeroptr` ကတော့ ပြောင်းလဲစေပါတယ်။
# ဘာကြောင့်လဲဆိုတော့ သူက
# အဲဒီ variable ရဲ့ memory address
# ကို reference လုပ်ထားလို့ပါ။
$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100