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

时间:2016-05-03 10:16:19

标签: string go format printf

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

类似的东西:

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

会返回

"foo in foo is foo"

2 个答案:

答案 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)
}

https://pkg.go.dev/text/template