Отформатировать строку в Go без вывода?
Есть ли простой способ форматирования строки в Go без ее вывода на консоль?
Я могу сделать так:
bar := "bar"
fmt.Printf("foo: %s", bar)
Но мне нужно, чтобы отформатированная строка возвращалась, а не выводилась, чтобы я мог работать с ней дальше.
Я мог бы также сделать что-то вроде этого:
s := "foo: " + bar
Но это становится трудно читаемым, когда форматируемая строка сложная, и громоздким, когда одна или несколько частей не являются строками и их нужно сначала конвертировать, например:
i := 25
s := "foo: " + strconv.Itoa(i)
Существует ли более простой способ сделать это?
5 ответ(ов)
Попробуйте использовать Sprintf()
. Этот метод не выводит результат, а сохраняет его для будущего использования. Посмотрите на следующий пример:
package main
import "fmt"
func main() {
address := "NYC"
fmt.Sprintf("Я живу в %v", address)
}
Когда вы выполните этот код, на выходе не будет ничего. Однако если вы присвоите результат Sprintf()
отдельной переменной, вы сможете использовать его в дальнейшем.
package main
import "fmt"
func main() {
address := "NYC"
fmt.Sprintf("Я живу в %v", address) // Результат не сохраняется
var city = fmt.Sprintf("живёт в %v", address) // Здесь мы сохраняем результат
fmt.Println("Майкл", city) // Теперь выводим на экран
}
Таким образом, Sprintf()
позволяет вам создавать строку, которую можно использовать позже, просто сохранив её результат в переменной.
Функция fmt.Sprintf
возвращает строку, и вы можете форматировать строку точно так же, как делали бы это с помощью fmt.Printf
. Разница заключается в том, что fmt.Printf
выводит форматированную строку непосредственно в стандартный вывод, тогда как fmt.Sprintf
создаёт и возвращает строку, которую вы можете сохранить в переменной или использовать позже. Таким образом, если вам нужно получить форматированную строку, вы должны использовать fmt.Sprintf
, а если нужно просто вывести текст на экран - используйте fmt.Printf
.
Вы можете создать проект на Go для форматирования строк из шаблонов (он позволяет форматировать строки в стиле C# или Python), который по результатам тестов производительности оказывается быстрее, чем fmt.Sprintf
. Вы можете найти его здесь: https://github.com/Wissance/stringFormatter.
Он работает следующим образом:
func TestStrFormat(t *testing.T) {
strFormatResult, err := Format("Hello i am {0}, my age is {1} and i am waiting for {2}, because i am {0}!",
"Michael Ushakov (Evillord666)", "34", "\"Great Success\"")
assert.Nil(t, err)
assert.Equal(t, "Hello i am Michael Ushakov (Evillord666), my age is 34 and i am waiting for \"Great Success\", because i am Michael Ushakov (Evillord666)!", strFormatResult)
strFormatResult, err = Format("We are wondering if these values would be replaced : {5}, {4}, {0}", "one", "two", "three")
assert.Nil(t, err)
assert.Equal(t, "We are wondering if these values would be replaced : {5}, {4}, one", strFormatResult)
strFormatResult, err = Format("No args ... : {0}, {1}, {2}")
assert.Nil(t, err)
assert.Equal(t, "No args ... : {0}, {1}, {2}", strFormatResult)
}
func TestStrFormatComplex(t *testing.T) {
strFormatResult, err := FormatComplex("Hello {user} what are you doing here {app} ?", map[string]string{"user":"vpupkin", "app":"mn_console"})
assert.Nil(t, err)
assert.Equal(t, "Hello vpupkin what are you doing here mn_console ?", strFormatResult)
}
Если у вас возникнут вопросы по использованию или реализации, не стесняйтесь спрашивать!
В вашем случае вам нужно использовать функцию Sprintf()
для форматирования строки.
func Sprintf(format string, a ...interface{}) string
Sprintf
форматирует строку в соответствии с заданным форматом и возвращает получившуюся строку.
Например:
s := fmt.Sprintf("Доброе утро, меня зовут %s, и я живу здесь уже %d лет", "Джон", 20)
В результате вы получите:
Доброе утро, меня зовут Джон, и я живу здесь уже 20 лет.
Я пришёл на эту страницу в поисках способа форматирования строк ошибки. Если кто-то нуждается в аналогичной помощи, вам стоит использовать функцию fmt.Errorf()
.
Сигнатура метода выглядит так: func Errorf(format string, a ...interface{}) error
.
Она возвращает отформатированную строку в виде значения, которое удовлетворяет интерфейсу error
.
Вы можете найти больше информации в документации - https://golang.org/pkg/fmt/#Errorf.
Как экранировать фигурные скобки ({}) в строке при использовании .format?
Как эффективно объединять строки в Go
Как написать многострочные строки в Go?
Как заполнить строку в Python пробелами?
Как преобразовать int в строку в Go?