Подтвердить что ты не робот

Go - параметры параметров вариационных функций

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

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

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

Die("foo")

Я получаю:

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

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

4b9b3361

Ответ 1

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

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

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