Ниже приведен фрагмент кода Go, по которому у меня возник вопрос. Конкретно что a
в этой функции?
func DPrintf(format string, a ...interface{}) (n int, err error) {
if Debug > 0 {
n, err = fmt.Printf(format, a...)
}
return
}
Может ли кто-нибудь сказать мне, что здесь за три точки? А что ...interface{}
делать?
Ответы:
Тип параметра с префиксом из трех точек (...) называется параметром с переменным числом аргументов . Это означает, что вы можете передать в этот параметр любое число или аргументы (как и в случае с
fmt.Printf()
). Функция получит список аргументов для параметра в виде фрагмента типа, объявленного для параметра ([]interface{}
в вашем случае). В спецификации Go говорится:Параметр:
a ...interface{}
Is для функции, эквивалентной:
a []interface{}
Разница в том, как вы передаете аргументы такой функции. Это делается либо путем предоставления каждого элемента среза отдельно, либо в виде одного среза, и в этом случае вам нужно будет добавить к значению среза три точки. Следующие примеры приведут к такому же вызову:
fmt.Println("First", "Second", "Third")
Будет делать то же самое, что и:
s := []interface{}{"First", "Second", "Third"} fmt.Println(s...)
Это также довольно хорошо объясняется в спецификации Go :
источник
Что касается
interface{}
термина, то это пустой интерфейс. Другими словами, интерфейс реализован всеми переменными в Go.Это своего рода аналог
java.lang.Object
илиSystem.Object
в C #, но вместо этого включает все типы переменных в языке. Таким образом, он позволяет передавать в метод что угодно.источник