在Go中是否有一种简单的方法来格式化字符串而不打印字符串?

我可以:

bar := "bar"
fmt.Printf("foo: %s", bar)

但是我希望返回格式化的字符串,而不是打印出来,这样我就可以进一步操作它。

我还可以这样做:

s := "foo: " + bar

但是,当格式字符串很复杂时,就很难读取,当一个或多个部分不是字符串,必须先转换时,就会很麻烦,比如

i := 25
s := "foo: " + strconv.Itoa(i)

有更简单的方法吗?


当前回答

而不是使用模板。新的,你可以使用新的内置的 模板。模板:

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() {
   bar := "bar"
   println(format("foo: {{.}}", bar))
   i := 25
   println(format("foo: {{.}}", i))
}

其他回答

尝试使用Sprintf();它不会打印输出,而是将其保存以备将来使用。 看看这个。

package main

import "fmt"

func main() {
    
    address := "NYC"

    fmt.Sprintf("I live in %v", address)

}

当您运行这段代码时,它不会输出任何东西。但是,一旦将Sprintf()分配给一个单独的变量,它就可以用于将来的目的。

package main

import "fmt"

func main() {
    
    address := "NYC"

    fmt.Sprintf("I live in %v", address)

    var city = fmt.Sprintf("lives in %v", address)
    fmt.Println("Michael",city)

}

fmt。SprintF函数返回一个字符串,您可以按照fmt的方式格式化字符串。PrintF

在本例中,您需要使用Sprintf()来格式化字符串。

func Sprintf(格式字符串,…interface{})字符串

Sprintf根据格式说明符格式化并返回结果字符串。

S:= fmt。Sprintf(“早上好,这里是%s,我从过去%d年就住在这里了”,“John”,20)

你的输出将是:

早上好,我是约翰,我在这里住了20年了。

Sprintf就是您要找的。

例子

fmt.Sprintf("foo: %s", bar)

你也可以在“围棋之旅”的错误示例中看到它的使用。

return fmt.Sprintf("at %v, %s", e.When, e.What)

而不是使用模板。新的,你可以使用新的内置的 模板。模板:

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() {
   bar := "bar"
   println(format("foo: {{.}}", bar))
   i := 25
   println(format("foo: {{.}}", i))
}