如何在golang中将可变参数传递给Sprintf
How to pass variable parameters to Sprintf in golang
我比较懒,想给Printf
函数传很多变量,可以吗?
(示例代码简化为3个参数,我需要10多个参数)
我收到以下消息:
cannot use v (type []string) as type []interface {} in argument to fmt.Printf
s := []string{"a", "b", "c", "d"} // Result from regexp.FindStringSubmatch()
fmt.Printf("%5s %4s %3s\n", s[1], s[2], s[3])
v := s[1:]
fmt.Printf("%5s %4s %3s\n", v...)
是的,这是可能的,只需将您的切片声明为 []interface{}
类型,因为那是 Printf()
所期望的。 Printf()
签名:
func Printf(format string, a ...interface{}) (n int, err error)
所以这会起作用:
s := []interface{}{"a", "b", "c", "d"}
fmt.Printf("%5s %4s %3s\n", s[1], s[2], s[3])
v := s[1:]
fmt.Printf("%5s %4s %3s\n", v...)
输出(Go Playground):
b c d
b c d
[]interface{}
和 []string
不可转换。有关详细信息,请参阅此问题+答案:
Type converting slices of interfaces in go
如果您已经有一个 []string
或者您使用了一个 returns 和 []string
的函数,您必须手动将其转换为 []interface{}
,如下所示:
ss := []string{"a", "b", "c"}
is := make([]interface{}, len(ss))
for i, v := range ss {
is[i] = v
}
我比较懒,想给Printf
函数传很多变量,可以吗?
(示例代码简化为3个参数,我需要10多个参数)
我收到以下消息:
cannot use v (type []string) as type []interface {} in argument to fmt.Printf
s := []string{"a", "b", "c", "d"} // Result from regexp.FindStringSubmatch()
fmt.Printf("%5s %4s %3s\n", s[1], s[2], s[3])
v := s[1:]
fmt.Printf("%5s %4s %3s\n", v...)
是的,这是可能的,只需将您的切片声明为 []interface{}
类型,因为那是 Printf()
所期望的。 Printf()
签名:
func Printf(format string, a ...interface{}) (n int, err error)
所以这会起作用:
s := []interface{}{"a", "b", "c", "d"}
fmt.Printf("%5s %4s %3s\n", s[1], s[2], s[3])
v := s[1:]
fmt.Printf("%5s %4s %3s\n", v...)
输出(Go Playground):
b c d
b c d
[]interface{}
和 []string
不可转换。有关详细信息,请参阅此问题+答案:
Type converting slices of interfaces in go
如果您已经有一个 []string
或者您使用了一个 returns 和 []string
的函数,您必须手动将其转换为 []interface{}
,如下所示:
ss := []string{"a", "b", "c"}
is := make([]interface{}, len(ss))
for i, v := range ss {
is[i] = v
}