是否可以使用fmt.Sprintf()
将格式化字符串中的所有变量替换为相同的值?
类似的东西:
val := "foo"
s := fmt.Sprintf("%v in %v is %v", val)
会返回
"foo in foo is foo"
答案 0 :(得分:17)
这是可能的,但必须修改格式字符串,您必须使用explicit argument indicies:
显式参数索引:
在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")
答案 1 :(得分:1)
您也可以使用 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)
}