Maison > développement back-end > Golang > Comment puis-je cloner des structures Go avec des champs non exportés ?

Comment puis-je cloner des structures Go avec des champs non exportés ?

Susan Sarandon
Libérer: 2024-12-23 14:09:17
original
777 Les gens l'ont consulté

How Can I Clone Go Structs with Unexported Fields?

Clonage de structures avec des champs non exportés

Dans Go, les structures avec des champs non exportés présentent un défi pour le clonage d'objets. Considérons un type défini comme :

type T struct {
    S  string
    is []int
}
Copier après la connexion

Une simple affectation comme ci-dessous ne créera pas de copie indépendante :

p := T{"some string", []int{10, 20}}
q := p
Copier après la connexion

En effet, le champ non exporté du type (est) est inaccessible et ne peut pas être copié explicitement.

Clonage via une méthode personnalisée

Une solution de contournement consiste à fournir une méthode Clone dans le package propriétaire du type. Cependant, cela ne fonctionne que pour les types au sein du même package.

Limitations des types tiers

Si un type avec des champs non exportés réside dans un package tiers, il n'existe aucun moyen direct de le cloner. Ceci est inhérent à la conception, car les champs non exportés doivent rester privés du package déclarant.

Approche alternative

Bien qu'il ne soit pas possible de cloner des champs non exportés, il est possible de créer nouvelles structures avec des valeurs vides (zéro) pour ces champs :

var r somepackage.T
s := somepackage.T{S: p.S}
Copier après la connexion

Dangereux Pratiques

L'utilisation du package non sécurisé n'est pas recommandée à cette fin, car elle peut conduire à un comportement inattendu et potentiellement dangereux.

Copie des champs non exportés

Lors de l'attribution d'une structure à une autre du même type, les champs non exportés sont correctement copiés. Cependant, la modification de ces champs n'est pas possible (ils ne peuvent être que nuls ou avoir la même valeur de pointeur que l'original).

type person struct {
    Name string
    age  *int
}

age := 22
p := &person{"Bob", &age}

p2 := new(person)
*p2 = *p // Copy unexported field

fmt.Println(p2) // Outputs: &{Bob 0x414020}
Copier après la connexion

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