Heim >Backend-Entwicklung >Golang >Wie kann ich den Zeigertyp und den Wert einer Schnittstellenvariablen mithilfe von Reflection in Go ändern?

Wie kann ich den Zeigertyp und den Wert einer Schnittstellenvariablen mithilfe von Reflection in Go ändern?

DDD
DDDOriginal
2024-11-17 11:05:02640Durchsuche

How can I change the pointer type and value of an interface variable using reflection in Go?

Zeigertyp und -wert unter Schnittstelle mit Reflexion ändern

Frage

Wie können wir den Zeigertyp und -wert von ändern? eine Variable, die von einer Schnittstelle mit definiert wird Reflexion?

Antwort

In Go wird alles als Wert übergeben, einschließlich Schnittstellen. Bei der Zuweisung eines Schnittstellenwerts wird eine Kopie erstellt, wodurch das Änderungspotenzial begrenzt wird.

Um den in einer Schnittstellenvariablen gespeicherten Wert zu ändern, muss deren Adresse verwendet werden. Indem wir über „reflect.ValueOf(&varName).Elem()“ auf die Adresse der Variablen zugreifen, können wir einen neuen Zeigerwert darin festlegen.

Beispiel

var a fmt.Stringer // Interface variable
a = &Greeter{"John"}

v := reflect.ValueOf(&a).Elem() // Access variable's address
v.Set(reflect.ValueOf(&Greeter2{"Jack"})) // Set new pointer value

fmt.Println(a.String()) // Hello2, My name is Jack (Greeter2.String() called)

Wichtige Punkte

  • Beginnen Sie mit der Adresse reflektieren.ValueOf(&varName).
  • Setzen Sie einen Zeigerwert hinein, da durch Zeiger implementierte Schnittstellen nicht in Kopien gesetzt werden können.

Einschränkungen

  • Das Ändern einer Kopie ist aufgrund der Pass-by-Value-Natur von Go nicht möglich. Nur durch die Übergabe eines Zeigers kann der Wert, auf den verwiesen wird, geändert werden, wodurch der Wert der Variablen effektiv geändert wird.
  • Das Ändern des Schnittstellentyps einer Variablen ist nicht möglich, da der tatsächliche Typ der Variablen zur Kompilierungszeit bestimmt wird.

Das obige ist der detaillierte Inhalt vonWie kann ich den Zeigertyp und den Wert einer Schnittstellenvariablen mithilfe von Reflection in Go ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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