是否有一种简单的方法来格式化字符串 走 </跨度> 没有打印字符串?
我可以:
bar:=“bar”fmt.Printf(“foo:%s”,bar)
但我希望返回格式化的字符串而不是打印,所以我可以…字符串,必须先转换,就像
我:= 25s:=“foo:”+ strconv.Itoa(i)
我很新 走 </跨度> - 我的背景是Ruby,这很简单。有更简单的方法吗? …
的sprintf 是你在找什么。
的 例 强>
fmt.Sprintf("foo: %s", bar)
你也可以看到它在使用中 错误的例子 作为“游览之旅”的一部分。
return fmt.Sprintf("at %v, %s", e.When, e.What)
在您的情况下,您需要使用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)
你的输出将是:
早安,这是约翰和我在过去20年生活在这里。
的 fmt.SprintF 强> 函数返回一个字符串,您可以按照与之相同的方式格式化字符串 的 fmt.PrintF 强>
对于“简单”字符串(通常适用于一行),最简单的解决方案是使用 fmt.Sprintf() 和朋友 ( fmt.Sprint() , fmt.Sprintln() )。这些类似于没有启动器的功能 S 信,但这些 Sxxx() variant将结果返回为a string 而不是将它们打印到标准输出。
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 将使用以下值初始化:
s
Hi, my name is Bob and I'm 23 years old.
的 小费: 强> 如果您只想连接不同类型的值,则可能不需要自动使用 Sprintf() (需要格式字符串)as Sprint() 就是这样。看这个例子:
Sprintf()
Sprint()
i := 23 s := fmt.Sprint("[age:", i, "]") // s will be "[age:23]"
仅用于连接 string s,你也可以使用 strings.Join() 您可以在其中指定自定义分隔符 string (放在要加入的字符串之间)。
strings.Join()
试试这些吧 去游乐场 。
如果您尝试创建的字符串更复杂(例如,多行电子邮件), fmt.Sprintf() 变得不那么可读并且效率低下(特别是如果你必须多次这样做)。
为此,标准库提供了包 text/template 和 html/template 。这些包实现了数据驱动的模板,用于生成文本输出。 html/template 用于生成HTML输出,以防止代码注入。它提供与包相同的接口 text/template 而应该用来代替 text/template 每当输出是HTML。
text/template
html/template
使用 template 包基本上要求您以a的形式提供静态模板 string 值(可能源自文件,在这种情况下,您只提供文件名)可能包含静态文本,以及在引擎处理模板并生成输出时处理和执行的操作。
template
您可以提供在静态模板中包含/替换的参数,这些参数可以控制输出生成过程。这些参数的典型形式是 struct s和 map 可以嵌套的值。
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 ,创建和写入 bytes.Buffer (实现 io.Writer )。执行模板并将结果作为 string :
io.Writer
bytes.Buffer
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 1.10起,可以使用更新,更快,更专业的替代方案 bytes.Buffer 这是: strings.Builder 。用法非常相似:
strings.Builder
builder := &strings.Builder{} if err := t.Execute(builder, data); err != nil { panic(err) } s := builder.String()
注意:如果提供,您还可以显示模板执行的结果 os.Stdout 作为目标(也实现 io.Writer ):
os.Stdout
t := template.Must(template.New("email").Parse(emailTmpl)) if err := t.Execute(os.Stdout, data); err != nil { panic(err) }
这将写直接导致 os.Stdout 。试试吧 去游乐场 。