Форматировать строку Go без печати?



есть ли простой способ отформатировать строку в Go без печати строки?



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



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


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



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



s := "foo: " + bar


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



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


Я очень Новичок, чтобы пойти - мой фон в Ruby, где это просто. Есть ли более простой способ сделать это?

568   4  

4 ответов:

Sprintf

здесь это использование его в учебнике, " тур Go."

return fmt.Sprintf("at %v, %s", e.When, e.What)

1. Простые строки

для" простых " строк (обычно то, что вписывается в строку) самым простым решением является использование fmt.Sprintf() и друзья (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 Playground.

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 ne $i 0}}, {{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 Playground.

также обратите внимание, что с 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 Playground.

fmt.Команду функция возвращает строку, и вы можете отформатировать строку так же, как и с fmt.Е

в вашем случае, вам нужно использовать 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)

ваш вывод будет :

Comments

    Ничего не найдено.