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
Susan Sarandonoriginal
2024-12-23 14:09:17793parcourir

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
}

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

p := T{"some string", []int{10, 20}}
q := p

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}

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}

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!

Déclaration:
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