有没有一种简单的方法可以在Go中格式化一个字符串而不打印字符串?
我可以做到:
bar := "bar"
fmt.Printf("foo: %s", bar)
但是我希望返回格式化的字符串而不是打印出来,这样我就可以进一步操作它。
我也可以这样做:
s := "foo: " + bar
但是,当格式字符串很复杂时,这会变得很难阅读,当一个或多个部分不是字符串并且必须首先转换时,这会变得很麻烦,例如
i := 25
s := "foo: " + strconv.Itoa(i)
有没有更简单的方法?
8条答案
按热度按时间hfsqlsce1#
Sprintf就是你要找的。
示例
您还可以在Errors example中看到它作为“A Tour of Go”的一部分使用。
ars1skjm2#
1.简单字符串
对于“简单”字符串(通常适合一行),最简单的解决方案是使用
fmt.Sprintf()
和friends(fmt.Sprint()
,fmt.Sprintln()
)。这些类似于没有起始字母S
的函数,但这些Sxxx()
变体将结果作为string
返回,而不是将它们打印到标准输出。例如:
变量
s
将初始化为以下值:**提示:**如果您只是想连接不同类型的值,您可能不需要自动使用
Sprintf()
(需要格式字符串),因为Sprint()
正是这样做的。请看这个例子:对于仅连接
string
s,您也可以使用strings.Join()
,其中可以指定自定义分隔符string
(将放置在要连接的字符串之间)。在Go Playground上试试这些。
2.复杂字符串(文档)
如果你要创建的字符串比较复杂(例如多行电子邮件),
fmt.Sprintf()
的可读性和效率会降低(特别是当您必须多次执行此操作时)。为此,标准库提供了
text/template
和html/template
包。这些包实现了用于生成文本输出的数据驱动模板。html/template
用于生成安全的HTML输出,以防止代码注入。它提供了与text/template
包相同的接口,只要输出是HTML,就应该使用它来代替text/template
。使用
template
软件包基本上需要您提供一个string
值形式的静态模板(它可能来自一个文件,在这种情况下,您只需提供文件名),其中可能包含静态文本,以及当引擎处理模板并生成输出时处理和执行的操作。您可以提供包含/替换在静态模板中的参数,这些参数可以控制输出生成过程。这种参数的典型形式是可以嵌套的
struct
s和map
值。示例:
例如,假设您希望生成如下所示的电子邮件:
要生成这样的电子邮件正文,您可以使用以下静态模板:
并提供这样的数据来执行它:
模板的输出通常会写入
io.Writer
,因此如果您希望结果为string
,请创建并写入bytes.Buffer
(实现io.Writer
)。执行模板并得到结果string
:这将产生预期输出:
在Go Playground上试试。
还请注意,自Go 1.10以来,
bytes.Buffer
有了一个更新、更快、更专业的替代方案:strings.Builder
。用法非常相似:在Go Playground上试试这个。
注意:如果提供
os.Stdout
作为目标(它也实现了io.Writer
),也可以显示模板执行的结果:这将直接将结果写入
os.Stdout
。在Go Playground上试试这个。mu0hgdu03#
尝试使用
Sprintf()
;它将不打印输出,而是将其保存以供将来使用。看看这个。当你运行这段代码时,它不会输出任何东西。但是一旦你将
Sprintf()
分配给一个单独的变量,它就可以用于将来的用途。8qgya5xd4#
我已经创建了一个go项目,用于从模板中格式化字符串(它允许以*C#或Python*风格格式化字符串),通过性能测试,它比fmt.Sprintf更好,你可以在这里找到它https://github.com/Wissance/stringFormatter
其工作方式如下:
r7knjye25#
在本例中,您需要使用Sprintf()来格式化字符串。
func Sprintf(format string, a ...interface{}) string
Sprintf根据格式说明符格式化并返回结果字符串。
s := fmt.Sprintf("Good Morning, This is %s and I'm living here from last %d years ", "John", 20)
您的输出将是:
早上好,我是约翰,我在这里住了20年。
snvhrwxg6#
fmt.Sprintf
函数返回一个字符串,您可以使用与fmt.Printf
相同的方式格式化该字符串kqhtkvqz7#
我来到这个页面是为了寻找一种格式化错误字符串的方法。因此,如果有人需要同样的帮助,您可以使用
fmt.Errorf()
函数。方法签名是
func Errorf(format string, a ...interface{}) error
。它将格式化的字符串作为满足error
接口的值返回。您可以在文档中查找更多详细信息-https://golang.org/pkg/fmt/#Errorf。
uxh89sit8#
你可以直接使用
new
内建的模板,而不是使用template.New
。模板: