Emitir un puntero struct al puntero de la interfaz en Golang

Tengo una función

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

El propósito de esta función es poder tratar un puntero de cualquier tipo como entrada. Pero cuando quiero llamarlo con el puntero de una estructura, tengo un error.

 type MyStruct struct { f1 int } 

Al llamar a doStuff

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

yo tengo

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

¿Cómo puedo lanzar &ms para que sea compatible con *interface{} ?

No existe un “puntero a una interfaz” (técnicamente, puede usar uno, pero generalmente no lo necesita).

Como se ve en ” ¿cuál es el significado de la interfaz {} en golang? “, La interface es un contenedor con dos palabras de datos:

  • una palabra se usa para apuntar a una tabla de métodos para el tipo subyacente del valor,
  • y la otra palabra se utiliza para señalar los datos reales que se mantienen por ese valor.

interfaz

Así que elimine el puntero, y doStuff funcionará bien: la información de la interfaz será &ms , su puntero:

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

Mira este ejemplo :

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

Salida:

 Hello, playground: {1} 

Como newacct menciona en los comentarios :

Pasar el puntero a la interfaz funciona directamente porque si MyStruct ajusta a un protocolo, entonces *MyStruct también se ajusta al protocolo (ya que el conjunto de métodos de un tipo se incluye en el conjunto de métodos de su tipo de puntero).

En este caso, la interfaz es la interfaz vacía, por lo que acepta todos los tipos de todos modos, pero aún así.