Significato di ... interfaccia {} (punto punto punto punto)


93

Di seguito è riportato un pezzo di codice Go su cui ho delle domande. Nello specifico, cosa c'è ain questa funzione?

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

Qualcuno potrebbe dirmi cosa sono i tre punti qui? E cosa fa ...interface{}?


33
Il dotdotdot si chiama Ellipsis.
Erikw

Risposte:


161

Un tipo di parametro preceduto da tre punti (...) è chiamato parametro variadico . Ciò significa che puoi passare qualsiasi numero o argomento in quel parametro (proprio come con fmt.Printf()). La funzione riceverà l'elenco degli argomenti per il parametro come una sezione del tipo dichiarato per il parametro ( []interface{}nel tuo caso). La specifica Go afferma:

Il parametro finale in una firma di funzione può avere un tipo con prefisso .... Una funzione con tale parametro è chiamata variadic e può essere invocata con zero o più argomenti per quel parametro.

Un parametro:

a ...interface{}

È, per la funzione equivalente a:

a []interface{}

La differenza sta nel modo in cui passi gli argomenti a tale funzione. Si fa assegnando ogni elemento della fetta separatamente, o come una singola fetta, nel qual caso dovrai aggiungere il suffisso al valore della sezione con i tre punti. I seguenti esempi risulteranno nella stessa chiamata:

fmt.Println("First", "Second", "Third")

Farà lo stesso di:

s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)

Questo è spiegato abbastanza bene anche nella specifica Go :

Data la funzione e le chiamate

   func Greeting(prefix string, who ...string)
   Greeting("nobody")
   Greeting("hello:", "Joe", "Anna", "Eileen")

all'interno Greeting, whoavrà il valore nilnella prima chiamata e []string{"Joe", "Anna", "Eileen"}nella seconda.

Se l'argomento finale è assegnabile a un tipo di slice []T, può essere passato invariato come valore per un ...Tparametro se l'argomento è seguito da .... In questo caso non viene creata una nuova slice.

Data la fetta se il richiamo

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

all'interno Greeting, whoavrà lo stesso valore sdello stesso array sottostante.


10

Per quanto riguarda il interface{}termine, è l'interfaccia vuota. In altre parole, l'interfaccia implementata da tutte le variabili in Go.

Questo è un po 'analogo java.lang.Objectao System.Objectin C #, ma include invece ogni tipo di variabile nel linguaggio. Quindi ti consente di passare qualsiasi cosa al metodo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.