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

WBOY
Freigeben: 2024-02-10 12:42:17
nach vorne
361 Leute haben es durchsucht

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
}
Nach dem Login kopieren

Aber es erzeugt diese Struktur:

user := user{person: person{name: ""}, email: "", password: ""}
Nach dem Login kopieren

Wie kann ich so etwas machen:

type person struct {
  name string
}

type user struct {
  name person.name // here
  email, password string
}
Nach dem Login kopieren

Verwenden Sie es so

user := User{Name: "", Email: "", Password: ""}
Nach dem Login kopieren

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?",
    } 
Nach dem Login kopieren

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?",
Nach dem Login kopieren

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" }
Nach dem Login kopieren
Nach dem Login kopieren

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
    }
Nach dem Login kopieren
nameJetzt können Sie

natürlich das neue

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

    u := user{ name: "bob" }
Nach dem Login kopieren
Nach dem Login kopieren

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
Nach dem Login kopieren
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": ""
    }
Nach dem Login kopieren

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
    }
Nach dem Login kopieren

Aber

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

mit

Feldern gemarshallt:

    {
        "PersonName": {
            "Name": ""
        },
        "Name": "",
        "Email": "",
        "Password": ""
    }
Nach dem Login kopieren
🎜🎜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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!