Maison  >  Article  >  développement back-end  >  Comment utiliser un champ struct dans une autre structure sans le référencer comme clé

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

WBOY
WBOYavant
2024-02-10 12:42:17392parcourir

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
}

Mais il produit cette structure :

user := user{person: person{name: ""}, email: "", password: ""}

Comment puis-je faire quelque chose comme ça :

type person struct {
  name string
}

type user struct {
  name person.name // here
  email, password string
}

Utilisez-le comme ça

user := User{Name: "", Email: "", Password: ""}

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?",
    } 

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?",

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" }

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
    }

Maintenant, vous

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

champ :

    u := user{ name: "bob" }

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

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": ""
    }

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
    }
person 的编组字段名称,即使 user 没有 nameMais maintenant

est rassemblé en un

objet 🎜 avec 🎜 champs : 🎜
    {
        "PersonName": {
            "Name": ""
        },
        "Name": "",
        "Email": "",
        "Password": ""
    }
🎜🎜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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer