为了账号安全,请及时绑定邮箱和手机立即绑定

用相同的变量替换 Sprintf 中的所有变量

用相同的变量替换 Sprintf 中的所有变量

Go
Cats萌萌 2022-01-10 10:32:53
是否可以使用fmt.Sprintf()相同的值替换格式化字符串中的所有变量?就像是:val := "foo" s := fmt.Sprintf("%v in %v is %v", val)这将返回"foo in foo is foo"
查看完整描述

2 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

这是可能的,但必须修改格式字符串,您必须使用显式参数索引

显式参数索引:

在 Printf、Sprintf 和 Fprintf 中,每个格式化动词的默认行为是格式化调用中传递的连续参数。但是,动词前的符号 [n] 表示要对第 n 个单索引参数进行格式化。宽度或精度的“*”之前的相同符号选择保存该值的参数索引。在处理括号表达式 [n] 后,后续动词将使用参数 n+1、n+2 等,除非另有说明。

你的例子:

val := "foo"
s := fmt.Sprintf("%[1]v in %[1]v is %[1]v", val)
fmt.Println(s)

输出(在Go Playground上试试):

foo in foo is foo

当然上面的例子可以简单的写成一行:

fmt.Printf("%[1]v in %[1]v is %[1]v", "foo")

同样作为一个小的简化,第一个显式参数索引可以省略,因为它默认为1

fmt.Printf("%v in %[1]v is %[1]v", "foo")


查看完整回答
反对 回复 2022-01-10
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

你也可以使用text/template:


package main


import (

   "strings"

   "text/template"

)


func format(s string, v interface{}) string {

   t, b := new(template.Template), new(strings.Builder)

   template.Must(t.Parse(s)).Execute(b, v)

   return b.String()

}


func main() {

   val := "foo"

   s := format("{{.}} in {{.}} is {{.}}", val)

   println(s)

}

https://pkg.go.dev/text/template


查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 194 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信