Go by Example မြန်မာဘာသာ: Text Templates

Go က text/template package နဲ့ dynamic content ဖန်တီးဖို့ သို့မဟုတ် user ကို customized output ပြဖို့ built-in support ပေးထားပါတယ်။ html/template ဆိုတဲ့ ဆင်တူ package တစ်ခုကလည်း တူညီတဲ့ API ပေးပြီး လုံခြုံရေးဆိုင်ရာ feature တွေ ထပ်ပါပါတယ်။ HTML generate လုပ်ဖို့အတွက် အဲဒါကို သုံးသင့်ပါတယ်။

package main
import (
    "os"
    "text/template"
)

Template အသစ်တစ်ခု ဖန်တီးပြီး သူ့ရဲ့ body ကို string တစ်ခုကနေ parse လုပ်နိုင်ပါတယ်။ Template တွေဟာ static text နဲ့ {{...}} ထဲမှာ ပါတဲ့ “action” တွေရဲ့ ပေါင်းစပ်မှုဖြစ်ပါတယ်။ Action တွေက content ကို dynamic ထည့်သွင်းဖို့ သုံးပါတယ်။

func main() {
    t1 := template.New("t1")
    t1, err := t1.Parse("Value is {{.}}\n")
    if err != nil {
        panic(err)
    }

နောက်တစ်နည်းအနေနဲ့ template.Must function ကို သုံးပြီး Parse က error ပြန်ပေးရင် panic ဖြစ်အောင် လုပ်နိုင်ပါတယ်။ ဒါက global scope မှာ initialize လုပ်တဲ့ template တွေအတွက် အထူးအသုံးဝင်ပါတယ်။

    t1 = template.Must(t1.Parse("Value: {{.}}\n"))

Template ကို “execute” လုပ်ခြင်းအားဖြင့် သူ့ရဲ့ action တွေအတွက် သတ်မှတ်ထားတဲ့ တန်ဖိုးတွေနဲ့အတူ စာသားကို ထုတ်လုပ်ပါတယ်။ {{.}} action က Execute ကို parameter အဖြစ်ပေးလိုက်တဲ့ တန်ဖိုးနဲ့ အစားထိုးခံရပါတယ်။

    t1.Execute(os.Stdout, "some text")
    t1.Execute(os.Stdout, 5)
    t1.Execute(os.Stdout, []string{
        "Go",
        "Rust",
        "C++",
        "C#",
    })

အောက်မှာ သုံးမယ့် helper function တစ်ခုပါ။

    Create := func(name, t string) *template.Template {
        return template.Must(template.New(name).Parse(t))
    }

Data က struct ဖြစ်နေရင် {{.FieldName}} action ကို သုံးပြီး သူ့ရဲ့ field တွေကို access လုပ်နိုင်ပါတယ်။ Template execute လုပ်နေချိန်မှာ access လုပ်နိုင်ဖို့ field တွေကို export လုပ်ထားသင့်ပါတယ်။

    t2 := Create("t2", "Name: {{.Name}}\n")
    t2.Execute(os.Stdout, struct {
        Name string
    }{"Jane Doe"})

Map တွေအတွက်လည်း အတူတူပါပဲ။ Map တွေမှာတော့ key နာမည်တွေရဲ့ အကြီးအသေးပေါ် ကန့်သတ်ချက် မရှိပါဘူး။

    t2.Execute(os.Stdout, map[string]string{
        "Name": "Mickey Mouse",
    })

if/else က template တွေမှာ conditional execution ပေးပါတယ်။ Type တစ်ခုရဲ့ default value ဖြစ်တဲ့ 0၊ string အလွတ်၊ nil pointer စတာတွေကို false လို့ သတ်မှတ်ပါတယ်။ ဒီဥပမာက template ရဲ့ နောက်ထပ် feature တစ်ခုကိုလည်း ပြသထားပါတယ်: whitespace ဖြတ်ဖို့ action တွေထဲမှာ - သုံးတာပါ။

    t3 := Create("t3",
        "{{if . -}} yes {{else -}} no {{end}}\n")
    t3.Execute(os.Stdout, "not empty")
    t3.Execute(os.Stdout, "")

range block တွေက slice၊ array၊ map သို့မဟုတ် channel တွေကို loop လုပ်ခွင့်ပေးပါတယ်။ Range block ထဲမှာ {{.}} က လက်ရှိ iteration ရဲ့ item ကို ညွှန်းပါတယ်။

    t4 := Create("t4",
        "Range: {{range .}}{{.}} {{end}}\n")
    t4.Execute(os.Stdout,
        []string{
            "Go",
            "Rust",
            "C++",
            "C#",
        })
}
$ go run templates.go 
Value: some text
Value: 5
Value: [Go Rust C++ C#]
Name: Jane Doe
Name: Mickey Mouse
yes 
no 
Range: Go Rust C++ C# 

နောက်ဥပမာ: Regular Expressions.