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

我可以:

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

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

我还可以这样做:

s := "foo: " + bar

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

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

有更简单的方法吗?


当前回答

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

其他回答

Sprintf就是您要找的。

例子

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

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

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

我已经从模板创建了一个用于字符串格式化的go项目(它允许在c#或Python风格中格式化字符串),通过性能测试,它比fmt更先进。Sprintf,你可以在这里找到它https://github.com/Wissance/stringFormatter

它的工作方式如下:


func TestStrFormat(t *testing.T) {
    strFormatResult, err := Format("Hello i am {0}, my age is {1} and i am waiting for {2}, because i am {0}!",
                              "Michael Ushakov (Evillord666)", "34", "\"Great Success\"")
    assert.Nil(t, err)
    assert.Equal(t, "Hello i am Michael Ushakov (Evillord666), my age is 34 and i am waiting for \"Great Success\", because i am Michael Ushakov (Evillord666)!", strFormatResult)

    strFormatResult, err = Format("We are wondering if these values would be replaced : {5}, {4}, {0}", "one", "two", "three")
    assert.Nil(t, err)
    assert.Equal(t, "We are wondering if these values would be replaced : {5}, {4}, one", strFormatResult)

    strFormatResult, err = Format("No args ... : {0}, {1}, {2}")
    assert.Nil(t, err)
    assert.Equal(t, "No args ... : {0}, {1}, {2}", strFormatResult)
}

func TestStrFormatComplex(t *testing.T) {
    strFormatResult, err := FormatComplex("Hello {user} what are you doing here {app} ?", map[string]string{"user":"vpupkin", "app":"mn_console"})
    assert.Nil(t, err)
    assert.Equal(t, "Hello vpupkin what are you doing here mn_console ?", strFormatResult)
}

我来到这个页面专门寻找格式化错误字符串的方法。因此,如果有人需要同样的帮助,则需要使用fmt.Errorf()函数。

方法签名是func Errorf(format string, a…interface{})错误。 它返回格式化的字符串作为满足错误接口的值。

您可以在文档https://golang.org/pkg/fmt/#Errorf中查找更多详细信息。

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

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

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