Maison  >  Article  >  développement back-end  >  Pouvez-vous modifier le type de pointeur et la valeur d’une variable définie par une interface à l’aide de Reflection in Go ?

Pouvez-vous modifier le type de pointeur et la valeur d’une variable définie par une interface à l’aide de Reflection in Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-18 12:35:02407parcourir

Can You Change the Pointer Type and Value of a Variable Defined by an Interface Using Reflection in Go?

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

Dans Go, les interfaces représentent des contrats qui définissent des méthodes spécifiques, mais ne spécifient pas le type de l’objet sous-jacent. Cette flexibilité permet une liaison dynamique, mais peut également poser des problèmes lorsque l'on tente de modifier le type de pointeur et la valeur d'une variable définie par une interface.

Le type et la valeur du pointeur peuvent-ils être modifiés sous une interface ?

Changer la valeur du pointeur sous une interface est possible grâce à la réflexion. En définissant l'élément de la valeur de réflexion sur l'élément de la nouvelle valeur du pointeur, la valeur peut être modifiée. Cependant, changer le type de pointeur n'est pas directement possible.

Utiliser Reflection pour modifier la valeur du pointeur

Pour modifier la valeur du pointeur d'une variable définie par une interface, suivez ces étapes :

  1. Obtenez la valeur de réflexion de l'adresse du pointeur (par exemple, reflex.ValueOf(&a))
  2. Obtenez l'élément de la valeur de réflexion (par exemple, v := réflexion. ValueOf(&a).Elem())
  3. Définissez l'élément sur l'élément de la nouvelle valeur du pointeur (par exemple, v.Set(reflect.ValueOf(&newValue).Elem()))

Exemple

Dans le code suivant, la valeur de a est modifiée en utilisant la réflexion pour pointer vers un objet Greeter2 tout en mettant également à jour le nom en "Jack":

package main

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()) // Output: Hello, My name is John

    v := reflect.ValueOf(&a).Elem()
    v.Set(reflect.ValueOf(&Greeter2{"Jack"}).Elem())
    fmt.Println(a.String()) // Output: Hello2, My name is Jack
}

Remarque : Pour modifier le type de pointeur d'une variable, il faut la passer par adresse. En effet, Go transmet les valeurs par copie et seuls les pointeurs permettent de modifier indirectement la valeur pointée.

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