Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan medan struct dalam struct lain tanpa merujuknya sebagai kunci

Cara menggunakan medan struct dalam struct lain tanpa merujuknya sebagai kunci

WBOY
WBOYke hadapan
2024-02-10 12:42:17361semak imbas

Cara menggunakan medan struct dalam struct lain tanpa merujuknya sebagai kunci

Dalam pembangunan PHP, kita sering menghadapi situasi menggunakan medan struktur lain dalam satu struktur. Walau bagaimanapun, merujuknya secara langsung sebagai kunci boleh membawa kepada kod yang bersepah dan tidak dapat diselenggara. Jadi bagaimana untuk menggunakan medan struktur dalam struktur lain? Editor PHP Baicao memberikan anda penyelesaian yang ringkas dan jelas untuk menjadikan kod anda lebih jelas dan mudah dibaca. Mari lihat di bawah!

Kandungan soalan

Saya ingin memasukkan medan struct ke dalam struct lain tanpa perlu menggunakan nama struct.

Saya tahu saya boleh lakukan ini:

type person struct {
  name string
}

type user struct {
  person
  email, password string
}

Tetapi ia menghasilkan struktur ini:

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

Bagaimana saya boleh melakukan sesuatu seperti ini:

type person struct {
  name string
}

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

Guna macam ni

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

Adakah boleh?

Penyelesaian

Ringkasnya, ia tidak boleh dilakukan menggunakan pelaksanaan bahasa semasa.

Apabila memulakan teks, anda perlu jelas (atau, dengan kata lain: teks! [sic]). Sejak user 包含 person,因此文字 user 必须包含文字 person, ia kelihatan seperti ini:

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

Walau bagaimanapun, sebaik sahaja anda mempunyai user 类型的变量,您就可以利用匿名字段通过 user 设置(或获取)匿名 personnamepembolehubah

jenis pengguna, anda boleh memanfaatkan medan tanpa nama untuk menetapkan (atau mendapatkan) anonim

melalui pengguna:

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

Kenapa pergi membuat saya melakukan semua kerja ini? person

Mari bayangkan bahawa dalaman boleh dimulakan dengan cara yang anda cari

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

    u := user{ name: "bob" }

Sekarang mari kita bayangkan lebih lanjut bahawa kita kemudian mengubah suai struktur pengguna dan

menambah medan sendiri: name

    type user struct {
        person
        name string
        email string
        password string
    }

Kini anda

boleh user.person.name 的代码相同,但现在它正在初始化 user.name jelas memulakan medan

baharu:

    u := user{ name: "bob" }

Sila ambil perhatian bahawa ini berbeza daripada permulaan sebelumnya

. tak bagus.

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

Kod sedemikian juga menyembunyikan lebih banyak perangkap.

person 字段,user.person.namePertama sekali, menambah medan

dalam pengguna telah name 字段,则 this 是编组为 "name" 的字段,并且 user.person.namebegitu juga "memecahkan" rujukan tidak layak kepada pada pembolehubah pengguna:

    u.name = "bob" // used to set user.person.name, now sets user.name

Selain itu, hanya menggunakan medan tanpa nama

, medan user.person.name akan digabungkan ke json secara lalai sebagai medan "nama": user.person.name 添加 json

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

Jika medan

ditambah, maka ini ialah medan yang dimarshallkan kepada "name" dan medan user.person.name tidak dimarshallkan sama sekali person 被编组为带有 name > .

Anda mungkin fikir anda boleh tag

suka

    type user struct {
        person   `json:"personname"`
        name     string
        email    string
        password string
    }
person 的编组字段名称,即使 user 没有 nameTetapi kini

disusun menjadi objek

🎜 dengan 🎜 medan: 🎜
    {
        "PersonName": {
            "Name": ""
        },
        "Name": "",
        "Email": "",
        "Password": ""
    }
🎜🎜Ini akan berlaku 🎜 jika anda cuba menukar nama medan marshalling tanpa nama 🎜 walaupun pengguna tidak mempunyai medan 🎜. 🎜 🎜Ringkasnya: menggunakan struct tanpa nama dalam struct sebagai cara "menambah medan" boleh menjadi masalah dan rapuh, dan harus dielakkan. 🎜

Atas ialah kandungan terperinci Cara menggunakan medan struct dalam struct lain tanpa merujuknya sebagai kunci. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam