问题 fmt.Sprintf传递一组参数


对不起基本问题。我想传递一个切片作为参数 fmt.Sprintf。像这样的东西:

values := []string{"foo", "bar", "baz"}
result := fmt.Sprintf("%s%s%s", values...)

结果就是 foobarbaz,但这显然不起作用。

(我想格式化的字符串比这更复杂,所以简单的连接不会这样做:)

所以问题是:如果我有数组,我怎么能把它作为单独的参数传递给 fmt.Sprintf?或者:我可以在Go中调用一个传递参数列表的函数吗?


11222
2017-08-22 10:12


起源



答案:


正如您在IRC上发现的那样,这将起作用:

values := []interface{}{"foo", "bar", "baz"}
result := fmt.Sprintf("%s%s%s", values...)

您的原始代码不起作用,因为 fmt.Sprintf 接受一个 []interface{} 和 []string 无法隐式或显式转换为该类型。


12
2017-08-22 20:40



在某些用例中,这不太实用。例如,我正在尝试匹配一个接口 ...string 参数,所以我不能改变类型 []interface{} 没有明确分配新切片并复制所有元素。 - zstewart
是的,这是真的和不幸的。在这种情况下,你必须弄清楚是否值得分配和复制或找到另一种解决方案。 - Evan Shaw
@EvanShaw有什么目的 values...? - Kasun Siyambalapitiya
values... 相当于 fmt.Sprintf("%s%s%s", "foo", "bar", "baz"),而 values 相当于 fmt.Sprintf("%s%s%s", []interface{}{"foo", "bar", "baz"})。后者可能不是您想要的,并将在运行时生成错误消息。 - Evan Shaw
这在今天不起作用 - zakaria amine


答案:


正如您在IRC上发现的那样,这将起作用:

values := []interface{}{"foo", "bar", "baz"}
result := fmt.Sprintf("%s%s%s", values...)

您的原始代码不起作用,因为 fmt.Sprintf 接受一个 []interface{} 和 []string 无法隐式或显式转换为该类型。


12
2017-08-22 20:40



在某些用例中,这不太实用。例如,我正在尝试匹配一个接口 ...string 参数,所以我不能改变类型 []interface{} 没有明确分配新切片并复制所有元素。 - zstewart
是的,这是真的和不幸的。在这种情况下,你必须弄清楚是否值得分配和复制或找到另一种解决方案。 - Evan Shaw
@EvanShaw有什么目的 values...? - Kasun Siyambalapitiya
values... 相当于 fmt.Sprintf("%s%s%s", "foo", "bar", "baz"),而 values 相当于 fmt.Sprintf("%s%s%s", []interface{}{"foo", "bar", "baz"})。后者可能不是您想要的,并将在运行时生成错误消息。 - Evan Shaw
这在今天不起作用 - zakaria amine


我认为这样做的问题是Sprintf无法使用无限长度切片,所以它不实用。格式参数的数量必须与格式化指令的数量相匹配。您将要么必须将它们提取到局部变量中,要么写一些东西来迭代切片并将字符串连接在一起。我会选择后者。


-2
2017-08-22 11:13



我在IRC上得到了答案:它会随之而来 values := []interface{}{"foo", "bar", "baz"}。 - moraes
有趣。我不确定我喜欢它但是如果它有效:) - Deleted
我担心这个你甚至不错。什么是“无界长片”?在Go中没有这样的东西,所有切片都有len()和cap()。 - uriel
即在编译时不知道长度。我应该更清楚。 - Deleted