首页 > 解决方案 > 有没有办法有条件地“fmt”一个字符串?

问题描述

有没有办法在 Go 中有条件地用格式占位符填充字符串?换句话说,只是忽略额外的参数。例如:

foo := fmt.CondSprintf("foo", "bar")
// "foo" instead of "foo%!(EXTRA string=bar)"
foobar := fmt.CondSprintf("foo%s", "bar")
// "foobar"
foobar := fmt.CondSprintf("foo%s", "bar", "baz")
// "foobar"

我可以想象一些测试特定格式说明符的东西,但我试图解释所有格式说明符。像num := fmt.CountReplacements("foo")这样我可以构建一个大switch语句的方法也可以工作。

标签: stringgoprintf

解决方案


你可以做类似于你想要的template

var phrase bytes.Buffer
template.Must(template.New("").Parse("foo{{index . 0}}")).Execute(&phrase, []string{"bar", "baz"})

https://play.golang.org/p/ekGFOrkuKFv

"foo"产量"foo"

"foo{{index . 0}}{{index . 1}}"产量"foobarbaz"

虽然这很 hacky,但这个想法在 Java 中很有用:

String.format(“foo%s”, “bar”, “baz”)

和 Python

'foo{}'.format('bar','baz')

不确定我是否会称这些实现中的任何一个为“错误的”,它们比上面的 Go 代码更干净、更易读。举个例子,当我正常使用 Go 模板时,我的模板定义了几个键,我向它渲染了一个模型,其中可能有额外的键应该被忽略。


推荐阅读