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

How to change the result of fmt.Println with a prefix argument

我有以下代码:

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]

换句话说:所有参数都同等重要,因此不应以特殊方式处理任何参数。

import "fmt"

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

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

结果是:

[1 2 3 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{} 没有任何意义 - 定义一个类型并坚持使用它!