Тип параметра з префіксом із трьох крапок (...) називається варіадичним параметром . Це означає, що ви можете передавати будь-яке число або аргументи в цей параметр (як і в fmt.Printf()). Функція отримає список аргументів для параметра у вигляді зрізу типу, оголошеного для параметра ( []interface{}у вашому випадку). У специфікації Go зазначено:
Кінцевий параметр у підписі функції може мати тип із префіксом .... Функція з таким параметром називається варіадичною і може бути викликана нулем або більше аргументів для цього параметра.
Параметр:
a ...interface{}
Є для функції, еквівалентної:
a []interface{}
Різниця полягає в тому, як ви передаєте аргументи такій функції. Це робиться або шляхом надання кожного елемента зрізу окремо, або у вигляді одного зрізу, і в цьому випадку вам доведеться суфіксувати значення зрізу трьома крапками. Наступні приклади призведуть до того самого виклику:
fmt.Println("First", "Second", "Third")
Буде робити те саме, що:
s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)
Це також досить добре пояснено у специфікації Go :
Враховуючи функцію та дзвінки
func Greeting(prefix string, who ...string)
Greeting("nobody")
Greeting("hello:", "Joe", "Anna", "Eileen")
усередині Greeting, whoматиме значення nilв першому дзвінку, а []string{"Joe", "Anna", "Eileen"}в другому.
Якщо кінцевий аргумент можна призначити типу зрізу []T, він може бути переданий незмінним як значення ...Tпараметра, якщо за аргументом слідує .... У цьому випадку новий фрагмент не створюється.
Враховуючи зріз sі дзвінок
s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)
усередині Greeting, whoматиме те саме значення, що і sз тим самим базовим масивом.