Golang:格式化string而不打印?
有没有一种简单的方法来格式化一个string在没有打印string?
我可以:
bar := "bar" fmt.Printf("foo: %s", bar)
但我想要格式化的string返回而不是打印,所以我可以进一步操纵它。
我也可以做这样的事情:
s := "foo: " + bar
但是,当格式string很复杂时,这变得难以阅读,并且当一个或多个部分不是string并且必须首先被转换时
i := 25 s := "foo: " + strconv.Itoa(i)
我对Go非常陌生 – 我的背景是Ruby,在这里很简单。 有一个更简单的方法来做到这一点?
的sprintf
这里也是在教程“去一趟”中的一个使用。
return fmt.Sprintf("at %v, %s", e.When, e.What)
1.简单的string
对于“简单”string(通常是什么适合一行)最简单的解决scheme是使用fmt.Sprintf()
和朋友( fmt.Sprint()
, fmt.Sprintln()
)。 这些类似于没有启动器S
字母的function,但是这些Sxxx()
变体将结果作为string
返回,而不是将它们打印到标准输出。
例如:
s := fmt.Sprintf("Hi, my name is %s and I'm %d years old.", "Bob", 23)
variabless
将被初始化为值:
Hi, my name is Bob and I'm 23 years old.
提示:如果你只是想连接不同types的值,你可能不会自动需要使用Sprintf()
(这需要一个格式string),因为Sprint()
完全是这样的。 看到这个例子:
i := 23 s := fmt.Sprint("[age:", i, "]") // s will be "[age:23]"
对于仅连接string
s,您也可以使用strings.Join()
,您可以指定一个自定义分隔符string
(要放置在要join的string之间)。
在Go游乐场试试这些。
2.复杂的string(文档)
如果你想创build的string比较复杂(比如多行的电子邮件信息), fmt.Sprintf()
可读性就会降低,效率也会降低(尤其是如果你必须这么做的话)。
为此,标准库提供了text/template
和html/template
。 这些包实现了用于生成文本输出的数据驱动模板。 html/template
用于生成HTML输出安全的代码注入。 它提供了与包装text/template
相同的接口,只要输出是HTML,就应该使用它来代替text/template
。
使用template
包基本上要求您提供一个静态模板,其forms可以是string
值(可能源自文件,在这种情况下,您只提供文件名),其中可能包含静态文本,以及处理和执行的动作当引擎处理模板并生成输出时。
您可以提供在静态模板中包含/replace的参数,并可以控制输出生成过程。 这些参数的典型forms是可以嵌套的struct
和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
,创build并写入一个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上试试吧。
注意:如果你提供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游乐场试试这个。