Warum löst das Abrufen von Zeigern auf Schnittstellenwerte eine Ausnahme aus?

Patricia Arquette
Freigeben: 2024-10-28 19:18:02
Original
220 Leute haben es durchsucht

Why Does Retrieving Pointers to Interfaced Values Raise an Exception?

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>
Nach dem Login kopieren

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:

  • Das erste Wort enthält die Typinformationen des enthaltenen Werts.
  • Das zweite Wort speichert entweder den Wert selbst (sofern er in ein Wort passt) oder ein Zeiger auf seinen Speicher (wenn der Wert die Wortgröße überschreitet).

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!