很抱歉问这个基本问题。我想将一个切片作为参数传递给
fmt.Sprintf
。像这样的东西:
values := []string{"foo", "bar", "baz"}
result := fmt.Sprintf("%s%s%s", values...)
结果会是
foobarbaz
,但这显然行不通。
(我想要格式化的字符串比这更复杂,所以简单的串联是不行的:)
所以问题是:如果我有 am 数组,如何将它作为单独的参数传递给
fmt.Sprintf
?或者:我可以在 Go 中调用传递参数列表的函数吗?
正如您在 IRC 上发现的那样,这会起作用:
values := []interface{}{"foo", "bar", "baz"}
result := fmt.Sprintf("%s%s%s", values...)
您的原始代码不起作用,因为
fmt.Sprintf
接受 []interface{}
并且 []string
无法隐式或显式转换为该类型。
如果格式严格按照您的要求,那么接受的答案确实是正确的选择。
仅供参考,如果您只是出于日志目的而只是想打印它们,那么另一种方法是使用
%v
values := []string{"foo", "bar", "baz"}
result := fmt.Sprintf("%v", values)
fmt.Println(result)
结果:
[foo bar baz]
如果不使用数组,请使用
args ...any
package main
import "fmt"
func main() {
format := "%d,%d: %s"
check(format, 4, 5, "hello")
}
func check(format string, args ...any) {
fmt.Printf(format, args...)
}
如果就像连接数组值一样简单,可以选择使用
Join
函数:
func main() {
values := []string{"one", "two", "three"}
fmt.Println(strings.Join(values, ""))
}
如果更复杂,那么你可以有这样的功能:
func PrintValues(values []string) string {
result := ""
for _, val := range values {
result = fmt.Sprintf("%s%s", result, val)
}
return result
}
func main() {
values := []string{"one", "two", "three"}
fmt.Println(PrintValues(values))
}
您可以在
for
循环中更改它的功能
我认为这样做的问题是 Sprintf 不能处理无限长度的切片,所以它不实用。格式参数的数量必须与格式化指令的数量相匹配。您要么必须将它们提取到局部变量中,要么编写一些内容来迭代切片并将字符串连接在一起。我会选择后者。