Идти - 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 ответ:
Вариадические функции получают аргументы в виде среза типа. В этом случае ваша функция получает
[]interface{}
с именемargs
. Когда вы передаете этот аргумент вfmt.Sprintf
, Вы передаете его как единственный аргумент типа[]interface{}
. На самом деле вы хотите передать каждое значение вargs
как отдельный аргумент (так же, как вы их получили). Для этого необходимо использовать синтаксис...
.str := fmt.Sprintf(format, args...)
Это также объясняется в спецификации Go здесь.