Golang:没有打印的字符串格式?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (134)

有没有一种简单的方法可以在不打印字符串的情况下格式化一个字符串?

我能做到:

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

但我希望返回格式化字符串,而不是打印,这样我就可以进一步操作它。

我也可以这样做:

s := "foo: " + bar

但是,当格式字符串很复杂时,就很难读懂它,而当其中一个或多个部分不是字符串时,就变得很麻烦,并且必须先转换,例如

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

我是个新手--我的背景是Ruby,这很简单。有更简单的方法吗?

提问于
用户回答回答于

1.简单字符串

对于“简单”字符串(通常适合行),最简单的解决方案是使用fmt.Sprintf() and friends (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(放置在要连接的字符串之间)。

试试这些围棋游乐场...

2.复杂字符串(文件)

如果要创建的字符串更复杂(例如,多行电子邮件消息),fmt.Sprintf()可读性降低,效率降低(特别是当你不得不这样做很多次的时候)。

为此,标准库提供了包。text/template and html/template这些包实现了数据驱动的模板,用于生成文本输出。html/template用于生成针对代码注入安全的HTML输出。它提供与包相同的接口。text/template应该用而不是text/template每当输出是HTML时。

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

您可以提供静态模板中包含/替换的参数,这些参数可以控制输出生成过程。这类参数的典型形式如下structs and 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

试一试这个...

注意:如果只提供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.

热门问答

在serverless中,我能否自己host 一个express(nodejs)的服务?

Tina

腾讯云 · 产品经理 (已认证)

Go Serverless!
推荐
您好,可以这样的。您可以参考如下文档,申请下http function 您可以使用常见的 WEB 框架(如 Nodejs Web 框架:Express、Koa)编写 HTTP 函数。而 WEB 框架内置的一些中间件(如cors)也会极大的方便您的业务编写 文档链接 https:...... 展开详请

使用有过期时间的签名往Cos存储桶中上传文件,若上传还在进行中签名过期,上传是否会终止?

galenye

腾讯 · 工程师 (已认证)

对象存储专业搬砖工
推荐已采纳

如果你是使用的简单上传,它能接收5g以内的文件,那签名过期的文件还在上传的话,是没影响的,因为签名判断是在cos接受到请求时。

如果你是使用的sdk等封装的分片上传,那其实是多个请求去上传文件,如果签名过期了,那上传到某一刻,后面的请求都会返回403

存储桶的默认加速域名 cdn 如何更改业务类型, 即把静态加速改成下载加速?

Jinqn

腾讯 · 高级工程师 (已认证)

腾讯云COS前端开发
推荐

我理解你意思是,浏览器打开的时候要下载,不要直接显示。

通过存储桶的文件 Content-Type 来控制

为何我使用.Net API 生成的临时密钥无法进行文件操作?

推荐
cos有自己的密钥系统,应该是在控制台上,访问管理,API密钥,项目密钥那里,或者去看看cos的文档是如何说明的吧。 你通过ms接口创建cos临时密钥,也许的确会被限制一些,这个需要ms这个产品的人回答下比较好。 生成临时密钥和哪个SDK无关,可以直接在线调用也可以生成,通过AP...... 展开详请

tencentcloud-sdk-php-master github代码上没有vendor文件夹?

推荐
因为和composer冲突,因此导出时没有包含vendor目录。如果需要,可以考虑git clone方式拿到,或者到https://cloud.tencent.com/document/sdk/PHP#.E9.80.9A.E8.BF.87.E6.BA.90.E7.A0.81.E5...... 展开详请

织云安装包在哪里下载?

使用织云,必须要满足1、2步骤1、机器要同步到c.isd.com系统。简单讲,就是在c.isd.com上有这台机器(如果c.isd.com没有,而公司的cmdb【cmdb.oa.com】有,则需要同步到c.isd.com即可,同步需要联系zhiyunhelper同步,而没有的话,...... 展开详请

所属标签

扫码关注云+社区

领取腾讯云代金券