Signification de… interface {} (interface point point point)

93

Vous trouverez ci-dessous un morceau de code Go sur lequel j'ai une question. Plus précisément, qu'est-ce que acette fonction?

func DPrintf(format string, a ...interface{}) (n int, err error) {
  if Debug > 0 {
    n, err = fmt.Printf(format, a...)
  }
  return
}

Quelqu'un pourrait-il me dire quels sont les trois points ici? Et que fait ...interface{}-on?

BufBills
la source
33
Le dotdotdot s'appelle Ellipsis.
Erikw

Réponses:

161

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, whoaura la valeur nildans le premier appel, et []string{"Joe", "Anna", "Eileen"}dans le second.

Si l'argument final []Tpeut être affecté à un type de tranche , il peut être passé inchangé comme valeur d'un ...Tparamètre si l'argument est suivi de .... Dans ce cas, aucune nouvelle tranche n'est créée.

Compte tenu de la tranche set de l'appel

   s := []string{"James", "Jasmine"}
   Greeting("goodbye:", s...)

inside Greeting, whoaura la même valeur squ'avec le même tableau sous-jacent.

ANisus
la source
10

En ce qui concerne le interface{}terme, c'est l'interface vide. En d'autres termes, l'interface implémentée par toutes les variables dans Go.

C'est en quelque sorte analogue à java.lang.Objectou System.Objecten C #, mais inclut à la place chaque type de variable dans le langage. Cela vous permet donc de transmettre n'importe quoi à la méthode.

Dranyar
la source