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")
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
- 2 回答
- 0 关注
- 194 浏览
添加回答
举报