Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie ein Strukturfeld in einer anderen Struktur, ohne es als Schlüssel zu referenzieren

So verwenden Sie ein Strukturfeld in einer anderen Struktur, ohne es als Schlüssel zu referenzieren

WBOY
WBOYnach vorne
2024-02-10 12:42:17361Durchsuche

So verwenden Sie ein Strukturfeld in einer anderen Struktur, ohne es als Schlüssel zu referenzieren

Bei der PHP-Entwicklung kommt es häufig vor, dass ein Strukturfeld in einem anderen Strukturfeld verwendet wird. Die direkte Referenzierung als Schlüssel kann jedoch zu überladenem und nicht wartbarem Code führen. Wie verwendet man also Strukturfelder in einer anderen Struktur? Der PHP-Editor Baicao bietet Ihnen eine prägnante und klare Lösung, um Ihren Code klarer und leichter lesbar zu machen. Werfen wir einen Blick nach unten!

Frageninhalt

Ich möchte ein Strukturfeld in eine andere Struktur einfügen, ohne den Strukturnamen verwenden zu müssen.

Ich weiß, dass ich das schaffen kann:

type person struct {
  name string
}

type user struct {
  person
  email, password string
}

Aber es erzeugt diese Struktur:

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

Wie kann ich so etwas machen:

type person struct {
  name string
}

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

Verwenden Sie es so

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

Ist es möglich?

Lösung

Einfach ausgedrückt ist dies mit der aktuellen Sprachimplementierung nicht möglich.

Beim Initialisieren eines Textes müssen Sie explizit sein (oder mit anderen Worten: Text![sic]). Seit user 包含 person,因此文字 user 必须包含文字 person sieht es so aus:

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

Sobald Sie jedoch eine user 类型的变量,您就可以利用匿名字段通过 user 设置(或获取)匿名 personnameVariable

vom Typ Benutzer haben, können Sie das anonyme Feld nutzen, um die Anonymität

über Benutzer festzulegen (oder abzurufen):

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

Warum zwingt mich Go dazu, diese ganze Arbeit zu machen? person

Stellen wir uns vor, dass die Interna so initialisiert werden können, wie Sie es suchen

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

    u := user{ name: "bob" }

Stellen wir uns nun weiter vor, dass wir später die user-Struktur ändern und

eigene Felder hinzufügen:

    type user struct {
        person
        name string
        email string
        password string
    }
nameJetzt können Sie

natürlich das neue

Feld initialisieren: user.person.name 的代码相同,但现在它正在初始化 user.name

    u := user{ name: "bob" }

Bitte beachten Sie, dass sich dies von der vorherigen Initialisierung unterscheidet

. nicht gut.

Weitere Fragen

In solchem ​​Code sind noch weitere Fallen versteckt. user 中添加 name 字段已经类似地“破坏”了 user 变量上对 name

Erstens hat das Hinzufügen des

-Feldes person 字段,user.person.name in user

den unqualifizierten Verweis auf

in der user-Variablen name 字段,则 this 是编组为 "name" 的字段,并且 user.person.namein ähnlicher Weise „gebrochen“.

    u.name = "bob" // used to set user.person.name, now sets user.name
Da außerdem nur anonyme Felder verwendet werden, wird das Feld user.person.name standardmäßig als „Name“-Feld an JSON gemarshallt:

    {
        "name": "",
        "email": "",
        "password": ""
    }

Wenn das user.person.name 添加 json-Feld hinzugefügt wird, dann

dieses

ist das Feld, das an "name" gemarshallt wird, und das Feld user.person.name wird überhaupt nicht gemarshallt > .person 被编组为带有 name Du denkst vielleicht, du könntest mit „Gefällt mir“ markieren

    type user struct {
        person   `json:"personname"`
        name     string
        email    string
        password string
    }

Aber

jetzt person 的编组字段名称,即使 user 没有 name wird in ein Objekt

mit

Feldern gemarshallt:

    {
        "PersonName": {
            "Name": ""
        },
        "Name": "",
        "Email": "",
        "Password": ""
    }
🎜🎜Dies passiert 🎜, wenn Sie versuchen, den Marshalling-Feldnamen eines anonymen 🎜 zu ändern, obwohl der Benutzer kein 🎜-Feld hat. 🎜 🎜Kurz gesagt: Die Verwendung anonymer Strukturen innerhalb einer Struktur als Möglichkeit zum „Hinzufügen von Feldern“ kann problematisch und fragil sein und sollte vermieden werden. 🎜

Das obige ist der detaillierte Inhalt vonSo verwenden Sie ein Strukturfeld in einer anderen Struktur, ohne es als Schlüssel zu referenzieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen