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 S
huruf starter , tetapi Sxxx()
varian ini mengembalikan hasilnya sebagai string
bukannya mencetaknya ke output standar.
Sebagai contoh:
s := fmt.Sprintf("Hi, my name is %s and I'm %d years old.", "Bob", 23)
Variabel s
akan 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 string
s, 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/template
dan html/template
. Paket-paket ini mengimplementasikan templat yang digerakkan oleh data untuk menghasilkan keluaran teks. html/template
adalah untuk menghasilkan output HTML yang aman terhadap injeksi kode. Ini menyediakan antarmuka yang sama dengan paket text/template
dan harus digunakan alih-alih text/template
setiap kali output HTML.
Menggunakan template
paket pada dasarnya mengharuskan Anda untuk menyediakan template statis dalam bentuk string
nilai (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 struct
s dan map
nilai 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.Buffer
yang: 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.Stdout
sebagai 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 .