Форматировать строку Go без печати?
есть ли простой способ отформатировать строку в Go без печати строки?
Я могу сделать:
bar := "bar"
fmt.Printf("foo: %s", bar)
но я хочу, чтобы форматированная строка возвращалась, а не печаталась, чтобы я мог манипулировать ею дальше.
я мог бы также сделать что-то вроде:
s := "foo: " + bar
но это становится трудно читать, когда строка формата является сложным и громоздким, когда одна или многие части не являются строками и должны быть преобразованы в, как
i := 25
s := "foo: " + strconv.Itoa(i)
Я очень Новичок, чтобы пойти - мой фон в Ruby, где это просто. Есть ли более простой способ сделать это?
4 ответов:
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значение (которое может быть получено из файла, в этом случае вы указываете только имя файла), которое может содержать статический текст, и действия, которые обрабатываются и выполняются, когда механизм обрабатывает шаблон и генерирует выходные данные.вы можете указать параметры, которые включены / заменены в статическом шаблоне и которые могут управлять процессом генерации выходных данных. Типичным видом таких параметров являются
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 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.
в вашем случае, вам нужно использовать Sprintf () для форматирования строки.
func Sprintf(format string, a ...interface{}) stringSprintf форматирует в соответствии со спецификатором формата и возвращает полученную строку.
s := fmt.Sprintf("Good Morning, This is %s and I'm living here from last %d years ", "John", 20)ваш вывод будет :
Comments