Structs

Structs #

// Go ရဲ့ _structs_ ဆိုတာက type မတူတဲ့ values တွေကို ပေါင်းစည်းတဲ့နေရာမှာသုံးတယ်။
// အထူးသဖြင့် ကိုယ်ပိုင် data type တွေဖန်တီးတဲ့အချိန်မှာအသုံးပြုကြတယ်။
package main

import "fmt"

// ဒီမှာဆို `person` struct type ထဲမှာ `name` နှင့် age ဆိုတဲ့ field တွေရှိတယ်။
type person struct {
	name string
	age  int
}

// ဒီ `newPerson` function မှာဆိုရင် name ပေးပီးတော့ person struct တခုတည်ဆောက်လိုက်တယ်။
func newPerson(name string) *person {
	// local variable ဖြစ်လို့ pointer ကို စိတ်ချလက်ချ return ပေးလို့ရတယ်။
	// local variable က ပျောက်မသွားဘူး။
	p := person{name: name}
	p.age = 42
	return &p
}

func main() {

	// ဒီ syntax က struct အသစ်တခုတည်ဆောက်လိုက်တယ်။
	fmt.Println(person{"Bob", 20})

	// struct ကို initialize လုပ်နေတဲ့အချိန်မှာ name fields တွေကိုသတ်မှတ်ပေးလို့ရတယ်။
	fmt.Println(person{name: "Alice", age: 30})

	// age ကိုမသတ်မှတ်ထားဘူးဆို zero default ဖြစ်သွားမယ်။
	fmt.Println(person{name: "Fred"})

	// ဒီနေရာမှာ `&` prefix ကိုသုံးထားတာက person data ရဲ့ address ကိုပေးထားတာ။
	// data ကိုပေးထားတာမဟုတ်ဘူး။ struct ရဲ့ pointer ပေါ့။
	fmt.Println(&person{name: "Ann", age: 40})

	//  Go မှာ person struct တခုတည်ဆောက်တော့မယ်ဆိုရင် constructor function
	// တခ ုတည်ဆောက်ပီးသုံးရမယ် တိုက်ရိုက်မသုံးရဘူးဆိုပီးလက်ခံထားကြတယ်။
	fmt.Println(newPerson("Jon"))

	// struct fields တွေကို access လုပ်မယ်ဆို dot နဲ့လုပ်တယ်။
	s := person{name: "Sean", age: 50}
	fmt.Println(s.name)

	// struct pointer တွေသုံးမယ်ဆိုလဲ dot ကိုသုံးလို့ရတယ်။
	// pointer တွေရဲကနေ data ကိုယူတာကို GO ကနောက်ကွယ်ကနေလုပ်ပေးလိမ့်မယ်။
	sp := &s
	fmt.Println(sp.age)

	// Structs တွေက mutable (ပြောင်းလဲနိုင်တယ်)
	sp.age = 51
	fmt.Println(sp.age)
}
$ go run structs.go
{Bob 20}
{Alice 30}
{Fred 0}
&{Ann 40}
&{Jon 42}
Sean
50
51