Maison > développement back-end > Golang > Comment créer de véritables copies des valeurs d'interface dans Go lorsqu'il s'agit de références de pointeur ?

Comment créer de véritables copies des valeurs d'interface dans Go lorsqu'il s'agit de références de pointeur ?

Patricia Arquette
Libérer: 2024-12-07 09:40:15
original
690 Les gens l'ont consulté

How to Create True Copies of Interface Values in Go When Dealing with Pointer References?

Copie versus référence dans les valeurs d'interface

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.

Le problème : partager des valeurs via des références de pointeur

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.

Solution 1 : copier explicitement la structure sous-jacente

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
Copier après la connexion

Solution 2 : Utiliser Réflexion

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)
}
Copier après la connexion

En utilisant la réflexion, vous pouvez gérer les cas où la valeur dans user1 n'est pas un pointeur.

Conclusion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal