Maison >développement back-end >Golang >Pouvez-vous modifier à la fois le type de pointeur et la valeur d'une variable d'interface à l'aide de Reflection in Go ?
Dans le système de types de Go, les interfaces définissent des contrats que les types peuvent implémenter pour exposer des comportements spécifiques. Lorsque vous travaillez avec des valeurs d'interface, il est important de comprendre comment la transmission de valeurs et la réflexion entrent en jeu.
Dans Go, toutes les valeurs sont transmises par valeur, y compris les valeurs d'interface. Lorsque vous attribuez une valeur d'interface à une variable ou la transmettez à une fonction, une copie de la valeur d'interface est créée. Cette copie contient une référence à la valeur concrète sous-jacente et au type de cette valeur.
Vous avez mentionné que vous pouvez modifier la valeur du pointeur d'une variable d'interface à l'aide de la réflexion :
v.Elem().Set(reflect.ValueOf(&Greeter{"Jack"}).Elem())
Cela fonctionne car la réflexion donne accès à la valeur sous-jacente stockée dans l'interface. En appelant v.Elem(), vous obtenez une valeur de réflexion pour la valeur concrète, que vous pouvez ensuite modifier à l'aide de Set.
Cependant, votre question concerne la modification à la fois du type de pointeur et valeur d’une variable d’interface. Malheureusement, cela n'est pas possible en utilisant la réflexion de la manière que vous avez décrite :
v.Elem().Set(reflect.ValueOf(&Greeter2{"Jack"}).Elem())
Lorsque vous essayez cela, vous recevrez une erreur de panique car Go ne permet pas d'attribuer une valeur d'un type différent à une interface valeur. Plus précisément, Go exige que le type de valeur attribuée à une interface corresponde au type de l'interface elle-même.
Pour modifier à la fois le type de pointeur et la valeur d'une variable d'interface , vous devez d'abord créer une variable du type souhaité et transmettre son adresse à la valeur de réflexion. Cela vous permet de modifier la valeur stockée dans la variable via le pointeur.
var newGreeter2 = &Greeter2{"Jack"} reflect.ValueOf(&&a).Elem().Set(reflect.ValueOf(newGreeter2))
En utilisant cette approche, vous pouvez modifier efficacement à la fois le type et la valeur de la variable d'interface. Cependant, il est important de noter que vous travaillez toujours avec une copie de la valeur de l'interface, et non avec la variable d'origine elle-même.
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!