1. String sederhana
Untuk string "sederhana" (biasanya yang sesuai dengan garis) solusi paling sederhana adalah menggunakan fmt.Sprintf()dan teman ( fmt.Sprint(), fmt.Sprintln()). Ini analog dengan fungsi tanpa Shuruf starter , tetapi Sxxx()varian ini mengembalikan hasilnya sebagai stringbukannya mencetaknya ke output standar.
Sebagai contoh:
s := fmt.Sprintf("Hi, my name is %s and I'm %d years old.", "Bob", 23)
Variabel sakan diinisialisasi dengan nilai:
Hi, my name is Bob and I'm 23 years old.
Kiat: Jika Anda hanya ingin menggabungkan nilai dari berbagai jenis, Anda mungkin tidak perlu menggunakan secara otomatis Sprintf()(yang memerlukan format string) seperti Sprint()ini. Lihat contoh ini:
i := 23
s := fmt.Sprint("[age:", i, "]") // s will be "[age:23]"
Untuk penggabungan hanya strings, Anda juga dapat menggunakan strings.Join()tempat Anda dapat menentukan pemisah khusus string(untuk ditempatkan di antara string untuk bergabung).
Cobalah ini di Go Playground .
2. String kompleks (dokumen)
Jika string yang Anda coba buat lebih kompleks (mis. Pesan email multi-baris), fmt.Sprintf()menjadi kurang mudah dibaca dan kurang efisien (terutama jika Anda harus melakukannya berkali-kali).
Untuk ini perpustakaan standar menyediakan paket text/templatedan html/template. Paket-paket ini mengimplementasikan templat yang digerakkan oleh data untuk menghasilkan keluaran teks. html/templateadalah untuk menghasilkan output HTML yang aman terhadap injeksi kode. Ini menyediakan antarmuka yang sama dengan paket text/templatedan harus digunakan alih-alih text/templatesetiap kali output HTML.
Menggunakan templatepaket pada dasarnya mengharuskan Anda untuk menyediakan template statis dalam bentuk stringnilai (yang mungkin berasal dari file dalam hal ini Anda hanya memberikan nama file) yang mungkin berisi teks statis, dan tindakan yang diproses dan dieksekusi ketika mesin memproses templat dan menghasilkan output.
Anda dapat memberikan parameter yang disertakan / diganti dalam template statis dan yang dapat mengontrol proses pembuatan output. Bentuk khas dari parameter tersebut adalah structs dan mapnilai yang mungkin bersarang.
Contoh:
Misalnya, Anda ingin membuat pesan email yang terlihat seperti ini:
Hi [name]!
Your account is ready, your user name is: [user-name]
You have the following roles assigned:
[role#1], [role#2], ... [role#n]
Untuk menghasilkan badan pesan email seperti ini, Anda dapat menggunakan templat statis berikut:
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}}
`
Dan berikan data seperti ini untuk mengeksekusinya:
data := map[string]interface{}{
"Name": "Bob",
"UserName": "bob92",
"Roles": []string{"dbteam", "uiteam", "tester"},
}
Biasanya output dari template ditulis ke io.Writer, jadi jika Anda ingin hasilnya sebagai string, buat dan tulis ke bytes.Buffer(yang mengimplementasikan io.Writer). Menjalankan template dan mendapatkan hasilnya sebagai 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()
Ini akan menghasilkan output yang diharapkan:
Hi Bob!
Your account is ready, your user name is: bob92
You have the following roles assigned:
dbteam, uiteam, tester
Cobalah di Go Playground .
Juga mencatat bahwa sejak Go 1.10, lebih baru, alternatif yang lebih cepat, lebih khusus tersedia untuk bytes.Bufferyang: strings.Builder. Penggunaannya sangat mirip:
builder := &strings.Builder{}
if err := t.Execute(builder, data); err != nil {
panic(err)
}
s := builder.String()
Coba yang ini di Playground Go .
Catatan: Anda juga dapat menampilkan hasil eksekusi template jika Anda berikan os.Stdoutsebagai target (yang juga mengimplementasikan io.Writer):
t := template.Must(template.New("email").Parse(emailTmpl))
if err := t.Execute(os.Stdout, data); err != nil {
panic(err)
}
Ini akan menulis hasilnya langsung ke os.Stdout. Coba ini di Go Playground .