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!