Apakah ada cara sederhana untuk memformat string di Go tanpa mencetak string?
Dapat saya lakukan:
bar := "bar"
fmt.Printf("foo: %s", bar)
Tetapi saya ingin string yang diformat dikembalikan daripada dicetak sehingga saya dapat memanipulasinya lebih lanjut.
Saya juga bisa melakukan sesuatu seperti:
s := "foo: " + bar
Tetapi ini menjadi sulit untuk dibaca ketika format string itu rumit, dan rumit ketika satu atau banyak bagian bukan string dan harus dikonversi terlebih dahulu, seperti
i := 25
s := "foo: " + strconv.Itoa(i)
Apakah ada cara yang lebih sederhana untuk melakukan ini?
string
go
formatting
string-formatting
Carnegie
sumber
sumber
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 tanpaS
huruf starter , tetapiSxxx()
varian ini mengembalikan hasilnya sebagaistring
bukannya mencetaknya ke output standar.Sebagai contoh:
Variabel
s
akan diinisialisasi dengan nilai:Kiat: Jika Anda hanya ingin menggabungkan nilai dari berbagai jenis, Anda mungkin tidak perlu menggunakan secara otomatis
Sprintf()
(yang memerlukan format string) sepertiSprint()
ini. Lihat contoh ini:Untuk penggabungan hanya
string
s, Anda juga dapat menggunakanstrings.Join()
tempat Anda dapat menentukan pemisah khususstring
(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
danhtml/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 pakettext/template
dan harus digunakan alih-alihtext/template
setiap kali output HTML.Menggunakan
template
paket pada dasarnya mengharuskan Anda untuk menyediakan template statis dalam bentukstring
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 danmap
nilai yang mungkin bersarang.Contoh:
Misalnya, Anda ingin membuat pesan email yang terlihat seperti ini:
Untuk menghasilkan badan pesan email seperti ini, Anda dapat menggunakan templat statis berikut:
Dan berikan data seperti ini untuk mengeksekusinya:
Biasanya output dari template ditulis ke
io.Writer
, jadi jika Anda ingin hasilnya sebagaistring
, buat dan tulis kebytes.Buffer
(yang mengimplementasikanio.Writer
). Menjalankan template dan mendapatkan hasilnya sebagaistring
:Ini akan menghasilkan output yang diharapkan:
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:Coba yang ini di Playground Go .
Catatan: Anda juga dapat menampilkan hasil eksekusi template jika Anda berikan
os.Stdout
sebagai target (yang juga mengimplementasikanio.Writer
):Ini akan menulis hasilnya langsung ke
os.Stdout
. Coba ini di Go Playground .sumber
Dalam kasus Anda, Anda perlu menggunakan Sprintf () untuk string format.
func Sprintf(format string, a ...interface{}) string
Format Sprintf menurut penentu format dan mengembalikan string yang dihasilkan.
s := fmt.Sprintf("Good Morning, This is %s and I'm living here from last %d years ", "John", 20)
Output Anda akan:
sumber
Fungsi fmt.SprintF mengembalikan sebuah string dan Anda dapat memformat string dengan cara yang sama seperti yang Anda miliki dengan fmt.PrintF
sumber
Kami dapat mengkustomisasi tipe String baru melalui
define new Type
denganFormat
dukungan.sumber