Maison > développement back-end > Golang > le corps du texte

Comment utiliser un champ struct dans une autre structure sans le référencer comme clé

WBOY
Libérer: 2024-02-10 12:42:17
avant
391 Les gens l'ont consulté

Comment utiliser un champ struct dans une autre structure sans le référencer comme clé

Dans le développement PHP, nous rencontrons souvent des situations où un champ de structure est utilisé dans un autre champ de structure. Cependant, le référencer directement en tant que clé peut conduire à un code encombré et impossible à maintenir. Alors comment utiliser les champs de structure dans une autre structure ? L'éditeur PHP Baicao vous propose une solution concise et claire pour rendre votre code plus clair et plus facile à lire. Jetons un coup d'œil ci-dessous !

Contenu de la question

Je souhaite insérer un champ de structure dans une autre structure sans avoir à utiliser le nom de la structure.

Je sais que je peux faire ça :

type person struct {
  name string
}

type user struct {
  person
  email, password string
}
Copier après la connexion

Mais il produit cette structure :

user := user{person: person{name: ""}, email: "", password: ""}
Copier après la connexion

Comment puis-je faire quelque chose comme ça :

type person struct {
  name string
}

type user struct {
  name person.name // here
  email, password string
}
Copier après la connexion

Utilisez-le comme ça

user := User{Name: "", Email: "", Password: ""}
Copier après la connexion

Est-ce possible ?

Solution

En termes simples, cela ne peut pas être fait avec l'implémentation actuelle du langage.

Lors de l'initialisation d'un texte, vous devez être explicite (ou, en d'autres termes : texte ! [sic]). Depuis user 包含 person,因此文字 user 必须包含文字 person, ça ressemble à ça :

    u := user{ 
        person: person{
            name: "bob",
        },
        email: "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="a5c7cac7e5c7cac7d6d5cad18bc6cac8">[email&#160;protected]</a>",
        password: "you're kidding right?",
    } 
Copier après la connexion

Cependant, une fois que vous disposez d'une user 类型的变量,您就可以利用匿名字段通过 user 设置(或获取)匿名 personnamevariable

de type user, vous pouvez profiter du champ anonyme pour définir (ou obtenir) l'anonyme

via user :

    u := user{}
    u.name = "bob"
    u.email = "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="8fede0edcfede0edfcffe0fba1ece0e2">[email&#160;protected]</a>",
    u.password = "you're kidding right?",
Copier après la connexion

Pourquoi va-t-il me faire faire tout ce travail ? person

Imaginons que les internes puissent être initialisés comme vous le recherchez

 : user 结构并添加它自己的 name

    u := user{ name: "bob" }
Copier après la connexion
Copier après la connexion

Imaginons maintenant plus loin que nous modifions ultérieurement la structure user et

ajoutons ses propres champs : name

    type user struct {
        person
        name string
        email string
        password string
    }
Copier après la connexion

Maintenant, vous

pouvez user.person.name 的代码相同,但现在它正在初始化 user.name évidemment initialiser le nouveau

champ :

    u := user{ name: "bob" }
Copier après la connexion
Copier après la connexion

Veuillez noter que ceci est différent de l'initialisation précédente

. pas bon.

Plus de questionsuser 中添加 name 字段已经类似地“破坏”了 user 变量上对 name

Il y a plus de pièges cachés dans un tel code.

person 字段,user.person.nameTout d'abord, l'ajout du champ

dans user a name 字段,则 this 是编组为 "name" 的字段,并且 user.person.namede la même manière "cassé" la référence non qualifiée à sur la variable user :

    u.name = "bob" // used to set user.person.name, now sets user.name
Copier après la connexion

De plus, en utilisant uniquement des champs

anonymes, le champ user.person.name est marshalé en json par défaut en tant que champ "nom": user.person.name 添加 json

    {
        "name": "",
        "email": "",
        "password": ""
    }
Copier après la connexion

Si le champ

est ajouté, alors this est le champ marshalé en "name" et le champ user.person.name n'est pas du tout marshalé person 被编组为带有 name > .

Vous pourriez penser que vous pourriez taguer

comme

    type user struct {
        person   `json:"personname"`
        name     string
        email    string
        password string
    }
Copier après la connexion
person 的编组字段名称,即使 user 没有 nameMais maintenant

est rassemblé en un

objet 🎜 avec 🎜 champs : 🎜
    {
        "PersonName": {
            "Name": ""
        },
        "Name": "",
        "Email": "",
        "Password": ""
    }
Copier après la connexion
🎜🎜Cela se produira 🎜 si vous essayez de changer le nom du champ de marshalling d'un anonyme 🎜 même si l'utilisateur n'a pas de champ 🎜. 🎜 🎜En bref : utiliser des structures anonymes au sein d'une structure comme moyen "d'ajouter des champs" peut être problématique et fragile, et doit être évité. 🎜

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:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal