1. Простые строки
Для «простых» строк (как правило, то, что вписывается в строку) самое простое решение - это использование fmt.Sprintf()
friends ( fmt.Sprint()
, fmt.Sprintln()
). Они аналогичны функциям без начальной S
буквы, но эти Sxxx()
варианты возвращают результат string
вместо того, чтобы выводить его на стандартный вывод.
Например:
s := fmt.Sprintf("Hi, my name is %s and I'm %d years old.", "Bob", 23)
Переменная s
будет инициализирована со значением:
Hi, my name is Bob and I'm 23 years old.
Подсказка: Если вы просто хотите объединить значения разных типов, вам может не потребоваться автоматически использовать Sprintf()
(что требует строки формата), как это Sprint()
делает именно это. Смотрите этот пример:
i := 23
s := fmt.Sprint("[age:", i, "]") // s will be "[age:23]"
Для объединения только string
s, вы также можете использовать, strings.Join()
где вы можете указать пользовательский разделитель string
(для размещения между строками для соединения).
Попробуйте это на игровой площадке Go .
2. Сложные строки (документы)
Если строка, которую вы пытаетесь создать, является более сложной (например, многострочное сообщение электронной почты), она fmt.Sprintf()
становится менее читаемой и менее эффективной (особенно если вам приходится делать это много раз).
Для этого стандартная библиотека предоставляет пакеты text/template
и html/template
. Эти пакеты реализуют управляемые данными шаблоны для генерации текстового вывода. html/template
предназначен для генерации HTML-вывода, безопасного против внедрения кода. Он предоставляет тот же интерфейс, что и пакет, text/template
и его следует использовать вместо text/template
каждого вывода HTML.
Использование template
пакетов в основном требует предоставления статического шаблона в форме string
значения (которое может исходить из файла, в этом случае вы указываете только имя файла), которое может содержать статический текст, а также действия, которые обрабатываются и выполняются, когда Движок обрабатывает шаблон и генерирует вывод.
Вы можете предоставить параметры, которые включены / заменены в статическом шаблоне и которые могут управлять процессом генерации вывода. Типичная форма таких параметров - это struct
s и map
значения, которые могут быть вложенными.
Пример:
Например, допустим, вы хотите генерировать сообщения электронной почты, которые выглядят так:
Hi [name]!
Your account is ready, your user name is: [user-name]
You have the following roles assigned:
[role#1], [role#2], ... [role#n]
Чтобы сгенерировать подобные сообщения электронной почты, вы можете использовать следующий статический шаблон:
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}}
`
И предоставьте данные для его выполнения:
data := map[string]interface{}{
"Name": "Bob",
"UserName": "bob92",
"Roles": []string{"dbteam", "uiteam", "tester"},
}
Обычно выходные шаблоны записываются в io.Writer
, поэтому, если вы хотите получить результат как string
, создайте и запишите в bytes.Buffer
(который реализует io.Writer
). Выполнение шаблона и получение результата в виде 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()
Это приведет к ожидаемому результату:
Hi Bob!
Your account is ready, your user name is: bob92
You have the following roles assigned:
dbteam, uiteam, tester
Попробуйте это на игровой площадке Go .
Отметим также , что Go 1.10 новее, быстрее, более специализированы альтернатива доступна , bytes.Buffer
которая является: strings.Builder
. Использование очень похоже:
builder := &strings.Builder{}
if err := t.Execute(builder, data); err != nil {
panic(err)
}
s := builder.String()
Попробуйте это на Go Playground .
Примечание: вы также можете отобразить результат выполнения шаблона, если указали os.Stdout
в качестве цели (которая также реализует io.Writer
):
t := template.Must(template.New("email").Parse(emailTmpl))
if err := t.Execute(os.Stdout, data); err != nil {
panic(err)
}
Это запишет результат непосредственно в os.Stdout
. Попробуйте это на игровой площадке Go .