Zeiger auf eine Schnittstelle

Sie benötigen fast nie Zeiger auf Schnittstellentypen. Sie sollten Schnittstellen per Wert übergeben, und dabei kann das zugrunde liegende Daten weiterhin ein Zeiger sein.

Schnittstellen werden im Grunde auf der zugrunde liegenden Ebene durch zwei Felder repräsentiert:

  1. Ein Zeiger auf bestimmte Typinformationen. Man kann es als "Typ" bezeichnen.
  2. Ein Datenzeiger. Wenn die gespeicherten Daten ein Zeiger sind, werden sie direkt gespeichert. Wenn die gespeicherten Daten ein Wert sind, wird ein Zeiger auf diesen Wert gespeichert.

Wenn Sie möchten, dass Schnittstellenmethoden die zugrunde liegenden Daten ändern, müssen Sie Zeigerempfänger verwenden (weisen Sie den Objektzeiger der Schnittstellenvariablen zu).

type F interface {
  f()
}

type S1 struct{}

func (s S1) f() {}

type S2 struct{}

func (s *S2) f() {}

// f1.f() kann die zugrunde liegenden Daten nicht ändern
// f2.f() kann die zugrunde Daten ändern, Objektzeiger wird der Schnittstellenvariablen f2 zugewiesen
var f1 F = S1{}
var f2 F = &S2{}

Verwenden Sie niemals Zeiger auf eine Schnittstelle, das ist sinnlos. In der Go-Sprache ist die Schnittstelle selbst ein Verweistyp. Mit anderen Worten, der Schnittstellentyp selbst ist ein Zeiger. Für meine Bedürfnisse muss der Parameter für Tests nur myinterface sein, und ich muss nur einen *mystruct-Typ übergeben (und kann nur einen *mystruct-Typ übergeben), wenn ich den Wert übergebe.

type myinterface interface{
  print()
}

func test(value *myinterface){
  //etwas zu tun...
}

type mystruct struct {
  i int
}

// Implementieren Sie die Schnittstelle
func (this *mystruct) print(){
  fmt.Println(this.i)
  this.i=1
}

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