Maison > développement back-end > Golang > Pourquoi seuls les champs en majuscules dans les structures Go sont-ils accessibles en dehors du package, et comment puis-je inclure des champs en minuscules dans le marshaling JSON et les interactions avec la base de données ?

Pourquoi seuls les champs en majuscules dans les structures Go sont-ils accessibles en dehors du package, et comment puis-je inclure des champs en minuscules dans le marshaling JSON et les interactions avec la base de données ?

Barbara Streisand
Libérer: 2024-12-02 05:25:12
original
510 Les gens l'ont consulté

Why are only capitalized fields in Go structs accessible outside the package, and how can I include lowercase fields in JSON marshaling and database interactions?

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"`
}
Copier après la connexion

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)
}
Copier après la connexion

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!

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