Pointeurs vers une interface

Vous n'avez presque jamais besoin de pointeurs vers des types d'interface. Vous devez passer les interfaces par valeur, et ce faisant, les données sous-jacentes sont toujours passées en tant que pointeur.

Les interfaces sont essentiellement représentées par deux champs au niveau sous-jacent :

  1. Un pointeur vers des informations de type spécifique. Vous pouvez le considérer comme le "type".
  2. Un pointeur de données. Si les données stockées sont un pointeur, elles sont stockées directement. Si les données stockées sont une valeur, un pointeur vers cette valeur est stocké.

Si vous voulez que les méthodes de l'interface modifient les données sous-jacentes, vous devez utiliser des récepteurs de pointeurs (affectez le pointeur de l'objet à la variable d'interface).

type F interface {
  f()
}

type S1 struct{}

func (s S1) f() {}

type S2 struct{}

func (s *S2) f() {}

// f1.f() ne peut pas modifier les données sous-jacentes
// f2.f() peut modifier les données sous-jacentes, le pointeur de l'objet est affecté à la variable d'interface f2
var f1 F = S1{}
var f2 F = &S2{}

N'utilisez jamais de pointeurs vers une interface, c'est sans signification. En langage Go, l'interface elle-même est un type de référence. En d'autres termes, le type d'interface lui-même est un pointeur. Pour mes besoins, le paramètre pour les tests ne doit être que myinterface, et je dois uniquement passer un type *mystruct (et je ne peux passer qu'un type *mystruct) lors du passage de la valeur.

type myinterface interface{
	print()
}

func test(value *myinterface){
	//quelque chose à faire ...
}

type mystruct struct {
	i int
}

// Implémenter l'interface
func (this *mystruct) print(){
	fmt.Println(this.i)
	this.i=1
}

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