Как изменить результат fmt.Println с аргументом префикса - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть следующий код:

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 голосов
/ 22 сентября 2018

Решение Евгения (изменение сигнатуры функции) лучше, но если вы не можете изменить сигнатуру функции по любой причине:

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{} ничего не значит - определите тип и придерживайтесь его!

0 голосов
/ 22 сентября 2018
import "fmt"

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

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

Результат:

[1 2 3 0]
...