ℝap*_*ink 13 string format printf go
是否可以使用fmt.Sprintf()相同的值替换格式化字符串中的所有变量?
就像是:
val := "foo"
s := fmt.Sprintf("%v in %v is %v", val)
Run Code Online (Sandbox Code Playgroud)
哪会回来
"foo in foo is foo"
Run Code Online (Sandbox Code Playgroud)
icz*_*cza 19
这是可能的,但必须修改格式字符串,您必须使用显式参数指示:
显式参数索引:
在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)
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上试试):
foo in foo is foo
Run Code Online (Sandbox Code Playgroud)
当然,上面的例子可以简单地写成一行:
fmt.Printf("%[1]v in %[1]v is %[1]v", "foo")
Run Code Online (Sandbox Code Playgroud)
同样作为次要简化,可以省略第一个显式参数索引,因为它默认为1:
fmt.Printf("%v in %[1]v is %[1]v", "foo")
Run Code Online (Sandbox Code Playgroud)