Comment cloner une structure avec un champ non exporté ?
Dans Go, les structures avec des champs non exportés posent des problèmes lors du clonage d'objets. Si le champ d'une structure n'est pas exporté, il n'est pas accessible ni modifié en dehors du package déclarant.
Problème :
Considérez la structure T suivante :
type T struct { S string is []int }
Attribuer un objet T à un autre ne créera pas de copie indépendante car le champ non exporté est shared.
Solution 1 : Méthode Clone
La solution la plus simple consiste à fournir une méthode Clone dans le package où T est défini. Cette méthode peut copier explicitement les champs de T, y compris le champ non exporté.
Solution 2 : Setters
Si fournir une méthode Clone n'est pas réalisable, fournir un setter La fonction pour le champ non exporté, telle que SetIs(), permet une modification contrôlée du champ.
Limitation :
Il est important de noter que ces solutions reposent sur la disponibilité du code source du type. Si vous travaillez avec des packages tiers, le clonage de structures avec des champs non exportés peut ne pas être possible sans modifications du package d'origine.
Approche peu sûre (non recommandée) :
Pendant que l'utilisation du package unsafe peut contourner les restrictions d'accès aux champs non exportés, cette approche est fortement déconseillée car elle viole les principes d'encapsulation de Go et peut conduire à un temps d'exécution erreurs.
Option alternative :
Si la modification des champs non exportés n'est pas essentielle, envisagez d'extraire les données souhaitées dans une structure distincte et clonée. Par exemple, le champ is non exporté pourrait être extrait par réflexion, en préservant sa valeur initiale.
var r T s := T{S: p.S}
Conclusion :
Le clonage de structures avec des champs non exportés nécessite un examen attentif et peut impliquer des solutions spécifiques au package. Il est crucial de donner la priorité à la sécurité et à l'encapsulation du code tout en évaluant les options disponibles.
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!