Lancia un puntatore struct al puntatore dell’interfaccia in Golang

Ho una funzione

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

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

 type MyStruct struct { f1 int } 

Quando si chiama doStuff

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

io ho

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

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

Non esiste un “puntatore a un’interfaccia” (tecnicamente, puoi usarne uno, ma generalmente non ne hai bisogno).

Come visto in ” qual è il significato dell’interfaccia {} in golang? “, L’ interface è un contenitore con due parole di dati:

  • una parola è usata per indicare una tabella di metodi per il tipo sottostante del valore,
  • e l’altra parola è usata per indicare i dati effettivi che sono trattenuti da quel valore.

interfaccia

Quindi rimuovi il puntatore e doStuff funzionerà doStuff : i dati dell’interfaccia saranno &ms , il tuo puntatore:

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

Vedi questo esempio :

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

Produzione:

 Hello, playground: {1} 

Come newacct cita nei commenti :

Passare il puntatore all’interfaccia funziona direttamente perché, se MyStruct conforms a un protocollo, quindi *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.