Есть ли простой способ отформатировать строку в Go без печати строки?
Я могу сделать:
bar := "bar"
fmt.Printf("foo: %s", bar)
Но я хочу, чтобы отформатированная строка возвращалась, а не печаталась, чтобы я мог манипулировать ею дальше.
Я также мог бы сделать что-то вроде:
s := "foo: " + bar
Но это становится трудным для чтения, когда строка формата является сложной, и громоздкой, когда одна или несколько частей не являются строками и должны быть сначала преобразованы, как
i := 25
s := "foo: " + strconv.Itoa(i)
Есть ли более простой способ сделать это?
string
go
formatting
string-formatting
Карнеги
источник
источник
1. Простые строки
Для «простых» строк (как правило, то, что вписывается в строку) самое простое решение - это использование
fmt.Sprintf()
friends (fmt.Sprint()
,fmt.Sprintln()
). Они аналогичны функциям без начальнойS
буквы, но этиSxxx()
варианты возвращают результатstring
вместо того, чтобы выводить его на стандартный вывод.Например:
Переменная
s
будет инициализирована со значением:Подсказка: Если вы просто хотите объединить значения разных типов, вам может не потребоваться автоматически использовать
Sprintf()
(что требует строки формата), как этоSprint()
делает именно это. Смотрите этот пример:Для объединения только
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
значения, которые могут быть вложенными.Пример:
Например, допустим, вы хотите генерировать сообщения электронной почты, которые выглядят так:
Чтобы сгенерировать подобные сообщения электронной почты, вы можете использовать следующий статический шаблон:
И предоставьте данные для его выполнения:
Обычно выходные шаблоны записываются в
io.Writer
, поэтому, если вы хотите получить результат какstring
, создайте и запишите вbytes.Buffer
(который реализуетio.Writer
). Выполнение шаблона и получение результата в видеstring
:Это приведет к ожидаемому результату:
Попробуйте это на игровой площадке Go .
Отметим также , что Go 1.10 новее, быстрее, более специализированы альтернатива доступна ,
bytes.Buffer
которая является:strings.Builder
. Использование очень похоже:Попробуйте это на Go Playground .
Примечание: вы также можете отобразить результат выполнения шаблона, если указали
os.Stdout
в качестве цели (которая также реализуетio.Writer
):Это запишет результат непосредственно в
os.Stdout
. Попробуйте это на игровой площадке Go .источник
В вашем случае вам нужно использовать Sprintf () для форматирования строки.
func Sprintf(format string, a ...interface{}) string
Sprintf форматирует в соответствии со спецификатором формата и возвращает полученную строку.
s := fmt.Sprintf("Good Morning, This is %s and I'm living here from last %d years ", "John", 20)
Ваш вывод будет:
источник
Функция fmt.SprintF возвращает строку, и вы можете отформатировать строку точно так же, как и в fmt.PrintF.
источник
Мы можем настроить новый тип String через
define new Type
сFormat
поддержкой.источник