如何在golang中将变量参数传递给Sprintf

时间:2015-06-02 06:08:17

标签: go slice

我懒,想要将许多变量传递给Printf函数,是否可能? (示例代码简化为3个参数,我需要10个以上的参数)。

我收到以下消息:

  

不能在vmt.Printf的参数中使用v(type [] string)作为类型[] interface {}

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...)  

1 个答案:

答案 0 :(得分:6)

是的,可以将切片声明为[]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或使用的函数返回[]string,则必须手动将其转换为[]interface{},如下所示:

ss := []string{"a", "b", "c"}
is := make([]interface{}, len(ss))
for i, v := range ss {
    is[i] = v
}