Maison >développement back-end >Golang >Comment copier correctement les valeurs de l'interface dans Go ?
Copie des valeurs d'interface dans Go
Lorsque vous travaillez avec des interfaces dans Go, il est possible de rencontrer des scénarios dans lesquels vous devez faire une copie de une valeur d'interface. Le comportement de copie des valeurs d'interface diffère selon le type sous-jacent de l'interface.
Copie des interfaces de pointeur
Dans votre exemple, l'interface utilisateur a un type de pointeur. Lorsque vous affectez une variable utilisateur à une autre, la valeur du pointeur sous-jacente est copiée. Cela signifie que l'original et la copie pointent vers les mêmes données sous-jacentes. Toute modification effectuée via l'une ou l'autre variable sera reflétée dans les deux.
type User interface { Name() string SetName(name string) } type Admin struct { name string } func (a *Admin) Name() string { return a.name } func (a *Admin) SetName(name string) { a.name = name } func main() { var user1 User user1 = &Admin{name: "user1"} var user2 User user2 = user1 user2.SetName("user2") fmt.Println("User1's name:", user1.Name()) // "user2" fmt.Println("User2's name:", user2.Name()) // "user2" }
Dans cet exemple, la modification de user2 affecte également user1. En effet, user1 et user2 pointent vers la même instance d'administrateur.
Solution : cloner la valeur sous-jacente
Pour créer une copie fidèle d'une valeur d'interface, vous avez besoin pour cloner les données sous-jacentes. Une façon d’y parvenir est d’utiliser la réflexion. Voici un exemple :
var user3 User typ := reflect.TypeOf(user1) val := reflect.ValueOf(user1) if typ.Kind() == reflect.Ptr { newPtr := reflect.New(typ.Elem()) newPtr.Elem().Set(val.Elem()) user3 = newPtr.Interface().(User) } else { newVal := reflect.New(typ) newVal.Elem().Set(val) user3 = newVal.Elem().Interface().(User) } user3.SetName("user3") fmt.Println("User1's name:", user1.Name()) // "user1" fmt.Println("User3's name:", user3.Name()) // "user3"
Ce code crée une nouvelle instance du type sous-jacent, clone les données et les enveloppe dans une nouvelle interface utilisateur. Désormais, toute modification apportée à l'utilisateur 3 n'affectera pas l'utilisateur 1.
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!