Go by Example မြန်မာဘာသာ: 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

နောက်ဥပမာ: Strings and Runes.