5

Отформатировать строку в Go без вывода?

13

Есть ли простой способ форматирования строки в Go без ее вывода на консоль?

Я могу сделать так:

bar := "bar"
fmt.Printf("foo: %s", bar)

Но мне нужно, чтобы отформатированная строка возвращалась, а не выводилась, чтобы я мог работать с ней дальше.

Я мог бы также сделать что-то вроде этого:

s := "foo: " + bar

Но это становится трудно читаемым, когда форматируемая строка сложная, и громоздким, когда одна или несколько частей не являются строками и их нужно сначала конвертировать, например:

i := 25
s := "foo: " + strconv.Itoa(i)

Существует ли более простой способ сделать это?

5 ответ(ов)

0

Попробуйте использовать 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() позволяет вам создавать строку, которую можно использовать позже, просто сохранив её результат в переменной.

0

Функция fmt.Sprintf возвращает строку, и вы можете форматировать строку точно так же, как делали бы это с помощью fmt.Printf. Разница заключается в том, что fmt.Printf выводит форматированную строку непосредственно в стандартный вывод, тогда как fmt.Sprintf создаёт и возвращает строку, которую вы можете сохранить в переменной или использовать позже. Таким образом, если вам нужно получить форматированную строку, вы должны использовать fmt.Sprintf, а если нужно просто вывести текст на экран - используйте fmt.Printf.

0

Вы можете создать проект на 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)
}

Если у вас возникнут вопросы по использованию или реализации, не стесняйтесь спрашивать!

0

В вашем случае вам нужно использовать функцию Sprintf() для форматирования строки.

func Sprintf(format string, a ...interface{}) string

Sprintf форматирует строку в соответствии с заданным форматом и возвращает получившуюся строку.

Например:

s := fmt.Sprintf("Доброе утро, меня зовут %s, и я живу здесь уже %d лет", "Джон", 20)

В результате вы получите:

Доброе утро, меня зовут Джон, и я живу здесь уже 20 лет.
0

Я пришёл на эту страницу в поисках способа форматирования строк ошибки. Если кто-то нуждается в аналогичной помощи, вам стоит использовать функцию fmt.Errorf().

Сигнатура метода выглядит так: func Errorf(format string, a ...interface{}) error. Она возвращает отформатированную строку в виде значения, которое удовлетворяет интерфейсу error.

Вы можете найти больше информации в документации - https://golang.org/pkg/fmt/#Errorf.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь