Heim >Backend-Entwicklung >Golang >Warum sind nicht adressierbare Werte in Golang-Schnittstellen nicht über die Adresse zugänglich?
Das Konzept der nicht adressierbaren Werte in Go-Schnittstellen, das in der Golang-Dokumentation und in Community-Foren ausführlich diskutiert wird, wirft die Frage auf: Warum kann auf diese Werte nicht über ihre Adresse zugegriffen werden?
As the Go Wiki zu MethodSets (https://github.com/golang/go/wiki/MethodSets#interfaces) weist darauf hin: „Der in einer Schnittstelle gespeicherte konkrete Wert ist nicht adressierbar, genauso wie ein Kartenelement nicht adressierbar ist.“ " Die Nichtadressierbarkeit von Kartenelementen ist allgemein bekannt und wird im Begleitbeitrag „Warum sind Kartenwerte nicht adressierbar?“ ausführlich erläutert.
Allerdings , ist der zugrunde liegende Grund für die Nichtadressierbarkeit von Werten in Schnittstellen nicht so klar. Warum sieht das Sprachdesign diese Einschränkung vor?
Die Antwort liegt in der Wahrung der Typintegrität. Wenn ein Zeiger auf einen Wert eines bestimmten Typs einer Schnittstelle zugewiesen wird, sollte er auf einen Wert dieses Typs verweisen. Wenn die Schnittstelle jedoch Werte unterschiedlichen Typs enthalten könnte, würde der Zeiger ungültig, wenn der Schnittstelle ein Wert eines anderen Typs zugewiesen würde.
Betrachten Sie zur Veranschaulichung eine Schnittstelle I und zwei Typen A und B I implementieren:
type I interface{} type A int type B string
Wenn wir einen A-Wert in I speichern und die Adresse dieses Werts übernehmen, wäre der resultierende Zeiger der Typ *A. Wenn wir I jedoch anschließend einen B-Wert zuweisen, würde der Zeiger ungültig.
Die Nichtadressierbarkeit von Schnittstellenwerten hat direkte Auswirkungen für Methoden mit Zeiger Empfänger. Solche Methoden erwarten einen Zeiger auf einen bestimmten konkreten Typ. Da ein Nicht-Zeigerwert in einer Schnittstelle nicht adressierbar ist, kann er nicht an eine Methode mit einem Zeigerempfänger übergeben werden, was zu dem Fehler führt:
<type> does not implement <interface> (<name> method has pointer receiver)
Zusammenfassend lässt sich sagen, dass der Der Grund für die Nichtadressierbarkeit von Werten in Go-Schnittstellen ist der Schutz der Typintegrität. Ein Zeiger auf einen Wert eines bestimmten Typs sollte immer auf einen Wert dieses Typs verweisen. Dies kann nicht garantiert werden, wenn der Wert in einer Schnittstelle gespeichert ist, die Werte verschiedener Typen enthalten kann.
Das obige ist der detaillierte Inhalt vonWarum sind nicht adressierbare Werte in Golang-Schnittstellen nicht über die Adresse zugänglich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!