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]"
Для объединения только strings, вы также можете использовать, strings.Join()где вы можете указать пользовательский разделитель string(для размещения между строками для соединения).
Попробуйте это на игровой площадке Go .
2. Сложные строки (документы)
Если строка, которую вы пытаетесь создать, является более сложной (например, многострочное сообщение электронной почты), она fmt.Sprintf()становится менее читаемой и менее эффективной (особенно если вам приходится делать это много раз).
Для этого стандартная библиотека предоставляет пакеты text/templateи html/template. Эти пакеты реализуют управляемые данными шаблоны для генерации текстового вывода. html/templateпредназначен для генерации HTML-вывода, безопасного против внедрения кода. Он предоставляет тот же интерфейс, что и пакет, text/templateи его следует использовать вместо text/templateкаждого вывода HTML.
Использование templateпакетов в основном требует предоставления статического шаблона в форме stringзначения (которое может исходить из файла, в этом случае вы указываете только имя файла), которое может содержать статический текст, а также действия, которые обрабатываются и выполняются, когда Движок обрабатывает шаблон и генерирует вывод.
Вы можете предоставить параметры, которые включены / заменены в статическом шаблоне и которые могут управлять процессом генерации вывода. Типичная форма таких параметров - это structs и 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 .