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 ?
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 :
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!