1. Basit dizeler
"Basit" dizeler için (genellikle bir çizgiye uyan) en basit çözüm fmt.Sprintf()
ve arkadaşlar ( fmt.Sprint()
, fmt.Sprintln()
) kullanmaktır. Bunlar başlangıç S
harfi olmayan işlevlere benzer , ancak bu Sxxx()
varyantlar sonucu string
standart çıktıya yazdırmak yerine sonucu döndürür .
Örneğin:
s := fmt.Sprintf("Hi, my name is %s and I'm %d years old.", "Bob", 23)
Değişken s
şu değerle başlatılır:
Hi, my name is Bob and I'm 23 years old.
İpucu: Yalnızca farklı türdeki değerleri birleştirmek istiyorsanız, tam olarak bunu yaptığınız gibi otomatik olarak Sprintf()
(biçim dizesi gerektiren) kullanmanız gerekmeyebilir Sprint()
. Bu örneğe bakın:
i := 23
s := fmt.Sprint("[age:", i, "]") // s will be "[age:23]"
Yalnızca s'leri birleştirmek için string
, strings.Join()
özel bir ayırıcı string
(birleştirilecek dizeler arasına yerleştirilecek) belirtebileceğiniz yeri de kullanabilirsiniz .
Bunları Go Playground'da deneyin .
2. Karmaşık dizeler (belgeler)
Oluşturmaya çalıştığınız dize daha karmaşıksa (örneğin çok satırlı bir e-posta iletisi), fmt.Sprintf()
daha az okunabilir ve daha az verimli olur (özellikle bunu birçok kez yapmanız gerekiyorsa).
Bunun için standart kütüphane paketleri text/template
ve sağlar html/template
. Bu paketler, metin çıktısı oluşturmak için veriye dayalı şablonlar uygular. html/template
kod enjeksiyonuna karşı güvenli HTML çıktısı oluşturmak içindir. Paketle aynı arabirimi sağlar ve çıktı HTML olduğunda text/template
değil kullanılmalıdır text/template
.
template
Paketleri kullanmak, temel olarak, string
statik metin içerebilecek bir değer (bir dosyadan kaynaklanıyor olabilir, bu durumda yalnızca dosya adını verebilirsiniz) şeklinde statik bir şablon ve motoru şablonu işler ve çıktıyı üretir.
Statik şablona dahil edilen / değiştirilen ve çıktı oluşturma işlemini kontrol edebilen parametreler sağlayabilirsiniz. Bu tür parametrelerin tipik formu, iç içe olabilecek struct
s ve map
değerlerdir.
Misal:
Örneğin, şöyle görünen bir e-posta mesajı oluşturmak istediğinizi varsayalım:
Hi [name]!
Your account is ready, your user name is: [user-name]
You have the following roles assigned:
[role#1], [role#2], ... [role#n]
Bunun gibi e-posta mesajı gövdeleri oluşturmak için aşağıdaki statik şablonu kullanabilirsiniz:
const emailTmpl = `Hi {{.Name}}!
Your account is ready, your user name is: {{.UserName}}
You have the following roles assigned:
{{range $i, $r := .Roles}}{{if $i}}, {{end}}{{.}}{{end}}
`
Ve yürütmek için böyle veriler sağlayın:
data := map[string]interface{}{
"Name": "Bob",
"UserName": "bob92",
"Roles": []string{"dbteam", "uiteam", "tester"},
}
Normalde şablonların çıktıları bir 'e yazılır io.Writer
, bu nedenle sonucu bir olarak istiyorsanız, string
bir bytes.Buffer
(uygular io.Writer
) oluşturun ve üzerine yazın . Şablonu yürütme ve sonucu şu şekilde alma string
:
t := template.Must(template.New("email").Parse(emailTmpl))
buf := &bytes.Buffer{}
if err := t.Execute(buf, data); err != nil {
panic(err)
}
s := buf.String()
Bu beklenen çıktı ile sonuçlanacaktır:
Hi Bob!
Your account is ready, your user name is: bob92
You have the following roles assigned:
dbteam, uiteam, tester
Go Playground'da deneyin .
Ayrıca Go 1.10, çünkü daha yeni, daha hızlı, daha uzmanlaşmış bir alternatif mevcut olduğuna dikkat bytes.Buffer
hangi: strings.Builder
. Kullanımı çok benzer:
builder := &strings.Builder{}
if err := t.Execute(builder, data); err != nil {
panic(err)
}
s := builder.String()
Bunu Go Playground'da deneyin .
Not: os.Stdout
Hedef olarak sağlarsanız (ayrıca uygular io.Writer
) şablon yürütme sonucunu da görüntüleyebilirsiniz :
t := template.Must(template.New("email").Parse(emailTmpl))
if err := t.Execute(os.Stdout, data); err != nil {
panic(err)
}
Bu, sonucu doğrudan adresine yazacaktır os.Stdout
. Bunu Go Playground'da deneyin .