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/templatehtml/template 。 这些包实现了用于生成文本输出的数据驱动模板。 html/template用于生成HTML输出安全的代码注入。 它提供了与包装text/template相同的接口,只要输出是HTML,就应该使用它来代替text/template

使用template包基本上要求您提供一个静态模板,其forms可以是string值(可能源自文件,在这种情况下,您只提供文件名),其中可能包含静态文本,以及处理和执行的动作当引擎处理模板并生成输出时。

您可以提供在静态模板中包含/replace的参数,并可以控制输出生成过程。 这些参数的典型forms是可以嵌套的structmap值。

例:

例如,假设您想要生成如下所示的电子邮件:

 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游乐场试试这个。