Heim > Artikel > Backend-Entwicklung > Können Sie die Adresse eines Werts innerhalb einer Schnittstelle in Go übernehmen?
Wertadresse innerhalb einer Schnittstelle erfassen
Im Kontext der Programmiersprache Go fungiert eine Schnittstelle als Vertrag, der eine Menge definiert von Methoden, die ein Typ implementieren muss. Wenn einer Schnittstelle ein Wert zugewiesen wird, wird er in einen Schnittstellenwert eingeschlossen. Der Schnittstellenwert selbst speichert jedoch nicht den tatsächlichen Wert, sondern enthält eine Referenz darauf.
Daher führt der Versuch, die Adresse eines Werts innerhalb einer Schnittstelle mithilfe des &-Operators zu übernehmen, wie gezeigt, zu einem Fehler im folgenden Codeausschnitt:
<code class="go">import "container/list" type retry struct{} var el = list.Element{Value: retry{}} p := &el.Value.(retry) // Compilation error: cannot take the address of el.Value.(retry)</code>
Dieser Fehler ist auf die Tatsache zurückzuführen, dass der Wert innerhalb der Schnittstelle dem Schnittstellenwert selbst gehört und sein Speicher möglicherweise wiederverwendet wird, wenn der Schnittstelle ein neuer Wert zugewiesen wird . Eine Änderung des Werts an der erhaltenen Adresse würde sich direkt auf den Schnittstellenwert auswirken, was unerwünscht ist und zu unerwartetem Verhalten führen könnte.
Um dieser Situation zu begegnen, stehen alternative Ansätze zur Verfügung:
Zeiger statt Werte speichern:
Anstatt Strukturwerte direkt in der Schnittstelle zu speichern, kann man Zeiger auf diese Strukturen speichern. Dadurch wird sichergestellt, dass der Zeiger auch dann gültig bleibt, wenn sich der Schnittstellenwert ändert.
Elementreferenzen verwenden:
Eine weitere Option besteht darin, *list.Element-Werte als Referenzen auf die enthaltenen Strukturen zu übergeben. Dies ermöglicht effektiv einen indirekten Zugriff auf die Strukturwerte, ohne die Typsicherheit von Go zu verletzen.
Das obige ist der detaillierte Inhalt vonKönnen Sie die Adresse eines Werts innerhalb einer Schnittstelle in Go übernehmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!