Un type de paramètre précédé de trois points (...) est appelé paramètre variadique . Cela signifie que vous pouvez passer n'importe quel nombre ou arguments dans ce paramètre (comme avec fmt.Printf()
). La fonction recevra la liste des arguments du paramètre sous la forme d'une tranche du type déclaré pour le paramètre ( []interface{}
dans votre cas). La spécification Go stipule:
Le paramètre final dans une signature de fonction peut avoir un type préfixé par .... Une fonction avec un tel paramètre est appelée variadique et peut être appelée avec zéro ou plusieurs arguments pour ce paramètre.
Un paramètre:
a ...interface{}
Est, pour la fonction équivalente à:
a []interface{}
La différence réside dans la façon dont vous passez les arguments à une telle fonction. Cela se fait soit en donnant chaque élément de la tranche séparément, soit en une seule tranche, auquel cas vous devrez suffixer la valeur de la tranche avec les trois points. Les exemples suivants aboutiront au même appel:
fmt.Println("First", "Second", "Third")
Fera la même chose que:
s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)
Ceci est également expliqué assez bien dans la spécification Go :
Compte tenu de la fonction et des appels
func Greeting(prefix string, who ...string)
Greeting("nobody")
Greeting("hello:", "Joe", "Anna", "Eileen")
à l'intérieur Greeting
, who
aura la valeur nil
dans le premier appel, et []string{"Joe", "Anna", "Eileen"}
dans le second.
Si l'argument final []T
peut être affecté à un type de tranche , il peut être passé inchangé comme valeur d'un ...T
paramètre si l'argument est suivi de ...
. Dans ce cas, aucune nouvelle tranche n'est créée.
Compte tenu de la tranche s
et de l'appel
s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)
inside Greeting
, who
aura la même valeur s
qu'avec le même tableau sous-jacent.