如何使用前缀参数更改fmt.Println的结果

时间:2018-09-22 16:46:30

标签: go println

我有以下代码:

import "fmt"

func main() {
    P("1","2","3",0)
}

func P(prefix string,a ...interface{}){
    fmt.Println(prefix,a)
}

结果是:

1 [2 3 0]

但是我想获得以下结果之一:

1 2 3 0
[1 2 3 0]

换句话说:所有参数都具有相同的重要性,因此不应以特殊方式处理参数。

2 个答案:

答案 0 :(得分:1)

import "fmt"

func main() {
    P("1","2","3",0)
}

func P(a ...interface{}){
    fmt.Println(a)
}

结果是:

[1 2 3 0]

答案 1 :(得分:0)

Evgeny的解决方案(更改功能签名)是最好的,但是如果您由于某种原因无法更改功能签名:

func P(prefix string, a ...interface{}) {
    toPrint := []interface{}{prefix}
    toPrint = append(toPrint, a...)
    fmt.Println(toPrint...)  // 1 2 3 0
    // without the `...` you get [1 2 3 0]
}

或者您也可以循环fmt.Printf

func P(prefix string, a ...interface{}) {
    fmt.Print(prefix)
    for _, aa := range a {
        fmt.Printf(" %v", aa)
    }
    fmt.Println()  // for your final newline
}

当然,甚至更好的解决方案也包括消除对您传入的类型的所有疑问。interface{}毫无意义-定义一个类型并坚持下去!