Zeiger auf Schnittstellenwerte abrufen
Der Versuch, einen Zeiger auf einen in einer Schnittstelle gespeicherten Wert abzurufen, kann eine Ausnahme auslösen, wie in der Abbildung dargestellt Code unten:
<code class="go">import "container/list" type retry struct{} el := list.New().PushBack(retry{}) p := &el.Value.(retry)</code>
Dies führt zu einem Fehler, der besagt, dass die Adresse von el.Value.(retry) nicht übernommen werden kann. Dieses Verhalten ist nicht auf Strukturen beschränkt; Sie gilt für jeden Typ, der in einer Schnittstelle gespeichert ist.
Grundlegendes zur Schnittstellenwertdarstellung
Um diese Einschränkung zu verstehen, betrachten Sie die interne Darstellung eines Schnittstellenwerts. Es besteht aus zwei Wörtern:
Entscheidend ist, dass der enthaltene Wert Eigentum der Schnittstellenvariablen ist. Darüber hinaus kann der Speicher für diesen Wert wiederverwendet werden, wenn der Schnittstelle ein neuer Wert zugewiesen wird.
Folgen des zulässigen Zeigerabrufs
Um diese Prinzipien zu verstehen, beachten Sie Folgendes Code:
<code class="go">var v interface{} v = int(42) p := GetPointerToInterfaceValue(&v) // a pointer to an integer holding 42 v = &SomeStruct{...}</code>
Hier wurde der für die Ganzzahl verwendete Speicher umfunktioniert, um einen Zeiger auf eine Struktur zu speichern. Infolgedessen erzeugt die Dereferenzierung von *p nun eine ganzzahlige Darstellung des Zeigers auf SomeStruct. Dieses Verhalten kann das Typsystem untergraben.
Alternative Lösungen
Um dieses Problem zu vermeiden, sollten Sie erwägen, Zeiger auf Strukturen anstelle der Strukturen selbst in der Liste zu speichern. Alternativ können Sie *list.Element-Werte als Referenzen auf die enthaltenen Strukturen übergeben.
Das obige ist der detaillierte Inhalt vonWarum löst das Abrufen von Zeigern auf Schnittstellenwerte eine Ausnahme aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!