在 fmt.Sprintf 格式字符串中多次引用同一参数

我有这个功能:


func getTableCreationCommands(v string) string {

    return `

        CREATE TABLE share_` + v + ` PARTITION OF share FOR VALUES IN (` + v + `);

        CREATE TABLE nearby_` + v + ` PARTITION OF nearby FOR VALUES IN (` + v + `);

    `

}

有点不稳定...有没有办法使用格式化字符串fmt.Sprintf?


是这样的:


func getTableCreationCommands(v string) string {

    return fmt.Sprintf(`

        CREATE TABLE share_%v PARTITION OF share FOR VALUES IN (%v);

        CREATE TABLE nearby_%v PARTITION OF nearby FOR VALUES IN (%v);

    `, v, v, v, v)

}

但不需要通过v4 次?


慕村9548890
浏览 112回答 2
2回答

鸿蒙传说

包 fmtimport "fmt"显式参数索引:在 Printf、Sprintf 和 Fprintf 中,默认行为是每个格式化动词格式化调用中传递的连续参数。但是,动词前的符号 [n] 表示要改为格式化第 n 个单索引参数。v您可以传递一次变量。例如,package mainimport "fmt"func getTableCreationCommands(s string) string {    return fmt.Sprintf(`        CREATE TABLE share_%[1]v PARTITION OF share FOR VALUES IN (%[1]v);        CREATE TABLE nearby_%[1]v PARTITION OF nearby FOR VALUES IN (%[1]v);    `, s)}func main() {    fmt.Println(getTableCreationCommands(("X")))}游乐场:https://play.golang.org/p/fKV3iviuwll输出:CREATE TABLE share_X PARTITION OF share FOR VALUES IN (X);CREATE TABLE nearby_X PARTITION OF nearby FOR VALUES IN (X);

繁花如伊

你也可以使用text/template:package sameimport (   "strings"   "text/template")func getTableCreationCommands(v string) string {   t, b := new(template.Template), new(strings.Builder)   template.Must(t.Parse(`CREATE TABLE nearby_{{.}} PARTITION OF nearby FOR VALUES IN ({{.}});CREATE TABLE share_{{.}} PARTITION OF share FOR VALUES IN ({{.}});   `)).Execute(b, v)   return b.String()}https://pkg.go.dev/text/template
打开App,查看更多内容
随时随地看视频慕课网APP