Comprendre la visibilité des champs dans les structures Go
Lorsqu'ils travaillent avec des structures dans Go, les développeurs rencontrent souvent un problème où seuls les champs avec des identifiants en majuscules sont accessibles en dehors du forfait actuel. Cela peut être particulièrement problématique lors du stockage de structures dans des bases de données ou de leur rassemblement en JSON.
Dans l'extrait de code fourni, les structures Person et Sample contiennent des champs avec des identifiants en majuscules et en minuscules. Cependant, lors de l'interaction avec la base de données CouchDB ou de la conversion de la structure Sample en JSON, seuls les champs avec des identifiants en majuscules sont inclus.
Ce comportement est ancré dans les règles de visibilité de Go, qui dictent que les identifiants commençant par des lettres minuscules sont uniquement visible dans le package actuel. Étant donné que l'encodeur JSON et le client CouchDB sont situés dans des packages différents, ils ne peuvent pas accéder directement aux champs avec des identifiants minuscules dans la structure.
Solution : utiliser des balises JSON
Pour surmonter Face à cette limitation, Go fournit un mécanisme appelé « balises JSON ». Les balises JSON vous permettent de spécifier comment les champs de structure doivent être codés et décodés lors du marshaling et du démarshaling JSON. En ajoutant une balise JSON à un champ avec un identifiant minuscule, vous pouvez le rendre visible à l'encodeur JSON.
Par exemple :
type Sample struct { Name string `json:"name"` Age int `json:"age"` }
Dans ce code mis à jour, le nom et l'âge les champs sont tous deux balisés avec la directive json. Cela demande à l'encodeur JSON d'inclure les deux champs lors du marshaling, même si l'âge commence par une lettre minuscule.
Extension à CouchDB
Alors que la bibliothèque spécifiée pour l'accès à CouchDB le fait ne prend pas explicitement en charge les balises JSON, il est possible d'exploiter la fonctionnalité d'encodage JSON de la bibliothèque standard Go pour obtenir le résultat souhaité. Voici une version modifiée de la fonction PostDocument utilisant des champs balisés :
func (db *Database) PostDocument(v interface{}) (*Document, error) { b, err := json.Marshal(v) if err != nil { return nil, err } resp, err := db.httpClient.Post(db.URL+db.name+"/", "application/json", bytes.NewReader(b)) if err != nil { return nil, err } defer resp.Body.Close() return decodeDocument(resp.Body) }
En utilisant la fonction json.Marshal pour convertir la structure en JSON avant de la publier dans la base de données, les champs balisés sont correctement encodés.
Conclusion
Comprendre les règles de visibilité sur le terrain de Go et en tirer parti Les balises JSON sont cruciales lorsque vous travaillez avec des structures au-delà des limites des packages. En appliquant ces principes, vous pouvez vous assurer que tous les champs sont accessibles et correctement sérialisés lors de l'échange de données.
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!