Typ parametru poprzedzony trzema kropkami (...) nazywany jest parametrem wariadycznym . Oznacza to, że możesz przekazać dowolną liczbę lub argumenty do tego parametru (tak jak w przypadku fmt.Printf()
). Funkcja otrzyma listę argumentów dla parametru jako wycinek typu zadeklarowanego dla parametru ( []interface{}
w twoim przypadku). The Go Specyfikacja stanowi:
Ostatni parametr w sygnaturze funkcji może mieć typ poprzedzony znakiem .... Funkcja z takim parametrem nazywana jest wariadyczną i może być wywoływana z zerową lub większą liczbą argumentów dla tego parametru.
Parametr:
a ...interface{}
Czy dla funkcji równoważnej:
a []interface{}
Różnica polega na sposobie przekazywania argumentów do takiej funkcji. Odbywa się to przez podanie każdego elementu wycinka osobno lub jako pojedynczy wycinek, w którym to przypadku będziesz musiał dodać przyrostek wartości wycinka trzema kropkami. Poniższe przykłady spowodują to samo wywołanie:
fmt.Println("First", "Second", "Third")
Zrobi to samo, co:
s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)
Jest to całkiem dobrze wyjaśnione w specyfikacji Go :
Biorąc pod uwagę funkcję i wywołania
func Greeting(prefix string, who ...string)
Greeting("nobody")
Greeting("hello:", "Joe", "Anna", "Eileen")
wewnątrz Greeting
, who
będzie mieć wartość nil
w pierwszym wywołaniu i []string{"Joe", "Anna", "Eileen"}
w drugim.
Jeśli ostatni argument można przypisać do typu wycinka []T
, może zostać przekazany niezmieniony jako wartość ...T
parametru, jeśli po argumencie następuje ...
. W tym przypadku nie jest tworzony nowy wycinek.
Biorąc pod uwagę kawałek s
i zadzwoń
s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)
wewnątrz Greeting
, who
będą miały taką samą wartość, jak s
z tego samego podstawowego tablicy.