是否可以使用fmt.Sprintf()相同的值替换格式化字符串中的所有变量?
fmt.Sprintf()
就像是:
val := "foo" s := fmt.Sprintf("%v in %v is %v", val)
会回来的
"foo in foo is foo"
有可能,但是必须修改格式字符串,必须使用 显式参数索引 :
显式参数索引: 在Printf,Sprintf和Fprintf中,默认行为是为每个格式化动词格式化在调用中传递的连续参数。但是,动词前的符号[n]表示第n个单索引参数将被格式化。宽度或精度的’*’之前的相同符号选择保存该值的参数索引。在处理了带括号的表达式[n]后,除非另外指出,否则后续动词将使用自变量n + 1,n + 2等。
显式参数索引:
在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:
1
fmt.Printf("%v in %[1]v is %[1]v", "foo")