Maison  >  Article  >  développement back-end  >  Comment modifier le type de pointeur et la valeur d'une variable d'interface à l'aide de la réflexion dans Go ?

Comment modifier le type de pointeur et la valeur d'une variable d'interface à l'aide de la réflexion dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-20 01:34:03192parcourir

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

Modification du type et de la valeur du pointeur sous l'interface avec réflexion

Lorsque vous travaillez avec des interfaces dans Go, il est essentiel de comprendre que tout est transmis par valeur. Les interfaces ne font pas exception. Par conséquent, lorsque vous attribuez une valeur d’interface, une copie de cette valeur est créée, y compris la paire sous-jacente (valeur ; type). Cela signifie que toute modification apportée à la copie n'affectera pas la variable d'origine.

Pour modifier le type de pointeur et la valeur d'une variable d'interface, vous devez transmettre l'adresse de la variable au package de réflexion. En effet, la réflexion opère sur les valeurs et transmettre l'adresse vous permet de modifier la variable réelle plutôt qu'une copie.

Voici une version modifiée de votre code qui illustre cette approche :

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
}

Dans ce code, nous commençons par créer une variable d'interface 'a' et l'initialiser avec une structure Greeter. Nous utilisons ensuite le package de réflexion pour obtenir la valeur du pointeur vers « a » et le définissons pour qu'il pointe vers une nouvelle structure Greeter2. Enfin, nous imprimons la valeur mise à jour de « a » à la fois après l'opération de réflexion et après avoir directement défini « a » sur une nouvelle valeur.

Le résultat du programme est le suivant :

Hello, My name is John
Hello2, My name is Jack
Hello2, My name is Ron

Cela démontre que nous avons réussi à modifier le type de pointeur et la valeur de la variable d'interface « a » en utilisant la réflexion. Gardez à l'esprit que cette technique ne fonctionne que lors de la modification de la valeur pointée et non du pointeur lui-même, car seul *Greeter2 implémente fmt.Stringer, mais pas Greeter.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn