Punteros a una interfaz

Casi nunca necesitas punteros a tipos de interfaz. Debes pasar interfaces por valor, y al hacerlo, los datos subyacentes que se pasan todavía pueden ser un puntero.

Las interfaces están representadas esencialmente con dos campos a nivel subyacente:

  1. Un puntero a alguna información específica del tipo. Puedes pensar en esto como el "tipo".
  2. Un puntero a los datos. Si los datos almacenados son un puntero, se almacenan directamente. Si los datos almacenados son un valor, se almacena un puntero a ese valor.

Si deseas que los métodos de la interfaz modifiquen los datos subyacentes, debes usar receptores de puntero (asignar el puntero del objeto a la variable de la interfaz).

type F interface {
  f()
}

type S1 struct{}

func (s S1) f() {}

type S2 struct{}

func (s *S2) f() {}

// f1.f() no puede modificar los datos subyacentes
// f2.f() puede modificar los datos subyacentes, el puntero del objeto se asigna a la variable de interfaz f2
var f1 F = S1{}
var f2 F = &S2{}

Nunca uses punteros a una interfaz, es sin sentido. En el lenguaje Go, la interfaz en sí es un tipo de referencia. En otras palabras, el tipo de interfaz en sí es un puntero. Para mis necesidades, el parámetro para la prueba solo necesita ser myinterface, y solo necesito pasar un tipo *mystruct (y solo puedo pasar un tipo *mystruct) al pasar el valor.

type myinterface interface{
	print()
}

func test(value *myinterface){
	// algo que hacer ...
}

type mystruct struct {
	i int
}

// Implementar la interfaz
func (this *mystruct) print(){
	fmt.Println(this.i)
	this.i=1
}

func main(){
	m := &mystruct{0}
test(m) // Incorrecto
test(*m) // Incorrecto
}