2014-11-27 33 views
20

Ho una funzioneCast a puntatore struct per interfacciarsi puntatore nella Golang

func doStuff(inout *interface{}) { 
    ... 
} 

lo scopo di questa funzione è quella di essere in grado di trattare un puntatore di qualsiasi tipo come input. Ma quando voglio chiamarlo con il puntatore di una struct ho un errore.

type MyStruct struct { 
    f1 int 
} 

Quando si chiama doStuff

ms := MyStruct{1} 
doStuff(&ms) 

ho

test.go:38: cannot use &ms (type *MyStruct) as type **interface {} in argument to doStuff 

Come posso gettato &ms per essere compatibile con *interface{}?

risposta

40

Non esiste un "puntatore a un'interfaccia" (tecnicamente, è possibile utilizzarne uno, ma in genere non è necessario).

Come visto in "what is the meaning of interface{} in golang?", interface è un contenitore con due parole di dati:

  • una parola viene usata per indicare un tavolo metodo per tipo sottostante del valore,
  • e l'altra parola viene utilizzato per punto per i dati effettivi trattenuti da tale valore.

interface

Quindi rimuovere il puntatore, e doStuff funzionano bene: i dati di interfaccia saranno &ms, il puntatore:

func doStuff(inout interface{}) { 
    ... 
} 

Vedi this example:

ms := MyStruct{1} 
doStuff(&ms) 
fmt.Printf("Hello, playground: %v\n", ms) 

Uscita:

Hello, playground: {1} 

Come newacct menzioni in the comments:

Passando il puntatore all'interfaccia lavora direttamente perché se MyStruct conforma ad un protocollo, *MyStruct inoltre conforme al protocollo (dal metodo set di un tipo è incluso nel set di metodi del tipo di puntatore).

In questo caso, l'interfaccia è l'interfaccia vuota, quindi accetta comunque tutti i tipi, ma comunque.

+0

Grande, tu fai la mia giornata! – taharqa

+2

Il modo in cui le variabili di interfaccia lavorano internamente non è rilevante per la domanda. Semanticamente una variabile di interfaccia contiene una copia del valore da cui è stata assegnata, proprio come qualsiasi altro tipo in Go. Sotto è implementato con un puntatore immutabile ai dati, ma non è visibile al programmatore. – newacct

+3

Dovresti spiegare che passare il puntatore all'interfaccia funziona direttamente perché se 'MyStruct' è conforme a un protocollo, allora' * MyStruct' si conforma anche al protocollo (poiché il set di metodi di un tipo è incluso nel set di metodi del tipo di puntatore). In questo caso, l'interfaccia è l'interfaccia vuota, quindi accetta comunque tutti i tipi, ma comunque. – newacct

Problemi correlati