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

Susan Sarandon
Freigeben: 2024-11-20 01:34:03
Original
189 Leute haben es durchsucht

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

Zeigertyp und -wert unter Schnittstelle mit Reflexion ändern

Bei der Arbeit mit Schnittstellen in Go ist es wichtig zu verstehen, dass alles als Wert übergeben wird. Schnittstellen sind keine Ausnahme. Wenn Sie einen Schnittstellenwert zuweisen, wird daher eine Kopie dieses Werts erstellt, einschließlich des zugrunde liegenden (Wert-Typ-)Paars. Dies bedeutet, dass an der Kopie vorgenommene Änderungen keine Auswirkungen auf die Originalvariable haben.

Um den Zeigertyp und den Wert einer Schnittstellenvariablen zu ändern, müssen Sie die Adresse der Variablen an das Reflexionspaket übergeben. Dies liegt daran, dass die Reflektion mit Werten arbeitet und die Übergabe der Adresse es Ihnen ermöglicht, die tatsächliche Variable statt einer Kopie zu ändern.

Hier ist eine modifizierte Version Ihres Codes, die diesen Ansatz demonstriert:

import (
    "fmt"
    "reflect"
)

type Greeter struct {
    Name string
}

func (g *Greeter) String() string {
    return "Hello, My name is " + g.Name
}

type Greeter2 struct {
    Name string
}

func (g *Greeter2) String() string {
    return "Hello2, My name is " + g.Name
}

func main() {
    var a fmt.Stringer
    a = &Greeter{"John"}
    fmt.Println(a.String()) // Hello, My name is John

    // Get the value of the pointer to variable 'a'
    v := reflect.ValueOf(&a).Elem()

    // Set the pointer to variable 'a' to point to a new Greeter2 struct
    v.Set(reflect.ValueOf(&Greeter2{"Jack"}))

    // Print the updated value of 'a'
    fmt.Println(a.String()) // Hello2, My name is Jack

    // Set a new value to 'a'
    a = &Greeter2{"Ron"}

    // Print the updated value of 'a'
    fmt.Println(a.String()) // Hello2, My name is Ron
}
Nach dem Login kopieren

In diesem Code erstellen wir zunächst eine Schnittstellenvariable „a“ und initialisieren sie mit einer Greeter-Struktur. Anschließend verwenden wir das Reflection-Paket, um den Wert des Zeigers auf „a“ abzurufen und ihn so zu setzen, dass er auf eine neue Greeter2-Struktur zeigt. Abschließend drucken wir den aktualisierten Wert von „a“ sowohl nach der Reflexionsoperation als auch nach dem direkten Setzen von „a“ auf einen neuen Wert.

Die Ausgabe des Programms ist wie folgt:

Hello, My name is John
Hello2, My name is Jack
Hello2, My name is Ron
Nach dem Login kopieren

Dies zeigt, dass wir den Zeigertyp und den Wert der Schnittstellenvariablen „a“ mithilfe von Reflektion erfolgreich geändert haben. Beachten Sie, dass diese Technik nur funktioniert, wenn der Zeigerwert und nicht der Zeiger selbst geändert wird, da nur *Greeter2 fmt.Stringer implementiert, nicht jedoch Greeter.

Das obige ist der detaillierte Inhalt vonWie ändere ich den Zeigertyp und den Wert einer Schnittstellenvariablen mithilfe von Reflection in Go?. 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