Dans Go, vous pouvez rencontrer des scénarios dans lesquels vous devez créer des copies de valeurs d'interface pour conserver un état distinct. Lors de la copie de valeurs d'interface contenant des références de pointeur, il est crucial de prendre en compte les implications. Cet article explore comment gérer de tels scénarios et fournit des techniques pour créer de véritables copies.
Dans l'exemple donné, user1 fait référence à une structure Admin via un pointeur. Cela signifie que lorsque vous attribuez user1 à user2, vous faites essentiellement pointer user2 vers la même structure Admin sous-jacente. Toute modification apportée via user1 ou user2 affectera la structure d'origine.
Une approche pour créer des copies distinctes consiste à taper affirmer la valeur dans user1, copier la structure Admin sous-jacente et enveloppez son adresse dans une nouvelle valeur User :
var user2 User padmin := user1.(*Admin) // Obtain *Admin pointer admin2 := *padmin // Make a copy of the Admin struct user2 = &admin2 // Wrap its address in another User
Pour une solution plus générique, vous pouvez tirer parti des capacités de réflexion de Go pour récupérer le type sous-jacent, créer dynamiquement une nouvelle valeur de ce type et l'envelopper dans une nouvelle valeur utilisateur :
if reflect.TypeOf(user1).Kind() == reflect.Ptr { // Pointer: user3 = reflect.New(reflect.ValueOf(user1).Elem().Type()).Interface().(User) } else { // Not pointer: user3 = reflect.New(reflect.TypeOf(user1)).Elem().Interface().(User) }
En utilisant la réflexion, vous pouvez gérer les cas où la valeur dans user1 n'est pas un pointeur.
Dans les cas où les valeurs de l'interface doivent être copiés et rester distincts, il est important d'examiner attentivement le type sous-jacent et d'utiliser des techniques appropriées telles que la copie explicite ou la réflexion pour créer des copies fidèles. Ces approches vous permettent de modifier une copie sans affecter l'original.
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!