Если вход становится больше (более сложным), или если вам нужно несколько раз заменять разные значения, тогда шаблоны более эффективны, чисты и более гибкие. Ознакомьтесь с пакетом text/template
.
Пакет template
анализирует ваш шаблон один раз, строит дерево из него, и как только вам нужно заменить значения, он строит вывод «на лету».
Взгляните на этот пример:
const templ = `Hi {{.Name}}!
Welcome {{.Place}}.
Please bring {{.ToBring}}
`
Вы можете разобрать такой шаблон строки:
t := template.Must(template.New("").Parse(templ))
Приготовьте свои входные данные либо как struct
или как map
:
data := map[string]string{
"Name": "Bob",
"Place": "Home",
"ToBring": "some beers",
}
И вы можете получить результат с помощью Template.Execute()
:
t.Execute(os.Stdout, data) // Prints result to the standard output
Вот полный, запускаемым пример: (попробуйте на Go Playground)
package main
import (
"os"
"text/template"
)
func main() {
data := map[string]string{
"Name": "Bob",
"Place": "Home",
"ToBring": "some beers",
}
t := template.Must(template.New("").Parse(templ))
t.Execute(os.Stdout, data) // Prints result to the standard output
// Now change something:
data["Name"] = "Alice"
data["ToBring"] = "a Teddy Bear"
t.Execute(os.Stdout, data)
}
const templ = `
Hi {{.Name}}!
Welcome {{.Place}}.
Please bring {{.ToBring}}
`
Выход:
Hi Bob!
Welcome Home.
Please bring some beers
Hi Alice!
Welcome Home.
Please bring a Teddy Bear
Получение результата как string
:
Если вы хотите результат как string
, вы можете записать результат в виде bytes.Buffer
и получить string
используя Buffer.String()
метод:
buf := bytes.Buffer{}
t.Execute(&buf, data)
var result string = buf.String()
Полная программа (попробуйте на Go Playground):
package main
import (
"bytes"
"fmt"
"text/template"
)
func main() {
data := map[string]string{
"Name": "Bob",
"Place": "Home",
"ToBring": "some beers",
}
fmt.Print(Execute(data))
}
var t = template.Must(template.New("").Parse(templ))
func Execute(data interface{}) string {
buf := bytes.Buffer{}
t.Execute(&buf, data)
return buf.String()
}
const templ = `
Hi {{.Name}}!
Welcome {{.Place}}.
Please bring {{.ToBring}}
`
Я думаю, что 'fmt.Sprintf' - лучший способ пойти, если у вас нет сложной обработки шаблонов. –
yes, thanx для уведомления :) –