1. Stringhe semplici
Per stringhe "semplici" (in genere ciò che si inserisce in una linea) sta usando la soluzione più semplice fmt.Sprintf()
e friends ( fmt.Sprint()
, fmt.Sprintln()
). Queste sono analoghe alle funzioni senza la S
lettera iniziale , ma queste Sxxx()
varianti restituiscono il risultato string
anziché stamparle sull'output standard.
Per esempio:
s := fmt.Sprintf("Hi, my name is %s and I'm %d years old.", "Bob", 23)
La variabile s
verrà inizializzata con il valore:
Hi, my name is Bob and I'm 23 years old.
Suggerimento: se si desidera semplicemente concatenare valori di tipi diversi, potrebbe non essere necessario utilizzare automaticamente Sprintf()
(che richiede una stringa di formato) Sprint()
esattamente come questo. Vedi questo esempio:
i := 23
s := fmt.Sprint("[age:", i, "]") // s will be "[age:23]"
Per concatenare solo string
i messaggi di posta elettronica , è anche possibile utilizzare strings.Join()
dove è possibile specificare un separatore personalizzato string
(da posizionare tra le stringhe da unire).
Prova questi sul Go Playground .
2. Stringhe complesse (documenti)
Se la stringa che stai cercando di creare è più complessa (ad esempio un messaggio di posta elettronica su più righe), fmt.Sprintf()
diventa meno leggibile e meno efficiente (soprattutto se devi farlo molte volte).
Per questo la libreria standard fornisce i pacchetti text/template
e html/template
. Questi pacchetti implementano modelli basati sui dati per generare output testuali. html/template
è per generare output HTML sicuro contro l'iniezione di codice. Fornisce la stessa interfaccia del pacchetto text/template
e dovrebbe essere usato invece text/template
ogni volta che l'output è HTML.
L'uso dei template
pacchetti richiede fondamentalmente di fornire un modello statico sotto forma di un string
valore (che potrebbe provenire da un file nel qual caso si fornisce solo il nome del file) che può contenere testo statico e azioni che vengono elaborate ed eseguite quando il engine elabora il modello e genera l'output.
È possibile fornire parametri che sono inclusi / sostituiti nel modello statico e che possono controllare il processo di generazione dell'output. Forma tipica di tali parametri sono struct
s e map
valori che possono essere annidate.
Esempio:
Ad esempio, supponiamo che tu voglia generare messaggi di posta elettronica simili a questo:
Hi [name]!
Your account is ready, your user name is: [user-name]
You have the following roles assigned:
[role#1], [role#2], ... [role#n]
Per generare corpi di messaggi di posta elettronica come questo, è possibile utilizzare il seguente modello statico:
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}}
`
E fornisci dati come questo per eseguirlo:
data := map[string]interface{}{
"Name": "Bob",
"UserName": "bob92",
"Roles": []string{"dbteam", "uiteam", "tester"},
}
Normalmente l'output dei modelli viene scritto in un io.Writer
, quindi se si desidera il risultato come un string
, creare e scrivere in un bytes.Buffer
(che implementa io.Writer
). Eseguire il modello e ottenere il risultato come 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()
Ciò comporterà l'output previsto:
Hi Bob!
Your account is ready, your user name is: bob92
You have the following roles assigned:
dbteam, uiteam, tester
Provalo sul Go Playground .
Si noti inoltre che dal Go 1.10, un nuovo, un'alternativa più veloce, più specializzato è a disposizione per bytes.Buffer
la quale è: strings.Builder
. L'utilizzo è molto simile:
builder := &strings.Builder{}
if err := t.Execute(builder, data); err != nil {
panic(err)
}
s := builder.String()
Prova questo sul Go Playground .
Nota: è anche possibile visualizzare il risultato di un'esecuzione del modello se si fornisce os.Stdout
come destinazione (che implementa anche io.Writer
):
t := template.Must(template.New("email").Parse(emailTmpl))
if err := t.Execute(os.Stdout, data); err != nil {
panic(err)
}
Questo scriverà il risultato direttamente su os.Stdout
. Prova questo sul Go Playground .