Maison > développement back-end > Golang > Comment copier correctement les valeurs de l'interface dans Go ?

Comment copier correctement les valeurs de l'interface dans Go ?

Patricia Arquette
Libérer: 2024-12-11 01:35:13
original
277 Les gens l'ont consulté

How to Properly Copy Interface Values in 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"
}
Copier après la connexion

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

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!

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