|
Go با بستهٔ text/template پشتیبانی داخلی برای ساختن محتوای پویا
یا نمایش خروجی سفارشی به کاربر دارد. بستهٔ همخانوادهای به نام
html/template همان API را فراهم میکند اما قابلیتهای امنیتی
بیشتری دارد و برای تولید HTML باید از آن استفاده کرد.
|
|
|
|

package main
|
|
|
import (
"os"
"text/template"
)
|
|
|
func main() {
|
|
میتوانیم یک قالب جدید بسازیم و بدنهاش را از یک
رشته تجزیه (parse) کنیم.
قالبها ترکیبی از متن ثابت و «اکشنهایی» هستند که داخل
{{...}} قرار میگیرند و برای درج پویای محتوا به کار میروند.
|
t1 := template.New("t1")
t1, err := t1.Parse("Value is {{.}}\n")
if err != nil {
panic(err)
}
|
|
بهجای آن میتوانیم از تابع template.Must استفاده کنیم تا
اگر Parse خطا برگرداند panic کند. این مخصوصاً برای
قالبهایی که در سطح سراسری مقداردهی میشوند مفید است.
|
t1 = template.Must(t1.Parse("Value: {{.}}\n"))
|
|
با «اجرای» قالب، متن آن را با مقادیر مشخصی برای
اکشنهایش تولید میکنیم. اکشن {{.}} با مقداری جایگزین
میشود که بهعنوان پارامتر به Execute داده شده.
|
t1.Execute(os.Stdout, "some text")
t1.Execute(os.Stdout, 5)
t1.Execute(os.Stdout, []string{
"Go",
"Rust",
"C++",
"C#",
})
|
|
تابع کمکی که در ادامه از آن استفاده میکنیم.
|
Create := func(name, t string) *template.Template {
return template.Must(template.New(name).Parse(t))
}
|
|
اگر داده یک ساختار باشد، میتوانیم با اکشن {{.FieldName}} به
فیلدهایش دسترسی پیدا کنیم. فیلدها باید exported (با حرف بزرگ)
باشند تا هنگام اجرای قالب در دسترس باشند.
|
t2 := Create("t2", "Name: {{.Name}}\n")
|
|
|
t2.Execute(os.Stdout, struct {
Name string
}{"Jane Doe"})
|
|
همین برای مپها هم صدق میکند؛ در مپها هیچ محدودیتی روی
حروف بزرگ و کوچک نام کلیدها نیست.
|
t2.Execute(os.Stdout, map[string]string{
"Name": "Mickey Mouse",
})
|
|
if/else اجرای شرطی را در قالبها فراهم میکند. یک مقدار وقتی
false در نظر گرفته میشود که مقدار پیشفرض نوعش باشد، مثل 0،
رشتهٔ خالی، اشارهگر nil و غیره.
این نمونه یک قابلیت دیگر قالبها را هم نشان میدهد:
استفاده از - در اکشنها برای حذف فاصلههای خالی.
|
t3 := Create("t3",
"{{if . -}} yes {{else -}} no {{end}}\n")
t3.Execute(os.Stdout, "not empty")
t3.Execute(os.Stdout, "")
|
|
بلوکهای range اجازه میدهند روی اسلایسها، آرایهها، مپها یا
کانالها حلقه بزنیم. داخل بلوک range، {{.}} برابر عنصر فعلی
پیمایش است.
|
t4 := Create("t4",
"Range: {{range .}}{{.}} {{end}}\n")
t4.Execute(os.Stdout,
[]string{
"Go",
"Rust",
"C++",
"C#",
})
}
|