一尘不染

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

go

是否可以使用fmt.Sprintf()相同的值替换格式化字符串中的所有变量?

就像是:

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

会回来的

"foo in foo is foo"

阅读 253

收藏
2020-07-02

共1个答案

一尘不染

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

显式参数索引:

在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")
2020-07-02