Идти - variadic функции параметров сквозной


Я пытаюсь написать простой fmt.Оболочка Fprintf, которая принимает переменное число аргументов, вот код:

func Die(format string, args ...interface{}) {
    str := fmt.Sprintf(format, args)
    fmt.Fprintf(os.Stderr, "%vn", str)
    os.Exit(1)
}

Но когда я называю его:

Die("foo")

Я получаю:

foo%!(EXTRA []interface {}=[])

Не могу понять, почему я получаю этот текст после "foo" и как правильно создавать обертки вокруг fmt.Fprintf?

1 22

1 ответ:

Вариадические функции получают аргументы в виде среза типа. В этом случае ваша функция получает []interface{} с именем args. Когда вы передаете этот аргумент в fmt.Sprintf, Вы передаете его как единственный аргумент типа []interface{}. На самом деле вы хотите передать каждое значение в args как отдельный аргумент (так же, как вы их получили). Для этого необходимо использовать синтаксис ....

str := fmt.Sprintf(format, args...)

Это также объясняется в спецификации Go здесь.