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

Cara menggunakan medan struct dalam struct lain tanpa merujuknya sebagai kunci

WBOY
Lepaskan: 2024-02-10 12:42:17
ke hadapan
400 orang telah melayarinya

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
}
Salin selepas log masuk

Tetapi ia menghasilkan struktur ini:

user := user{person: person{name: ""}, email: "", password: ""}
Salin selepas log masuk

Bagaimana saya boleh melakukan sesuatu seperti ini:

type person struct {
  name string
}

type user struct {
  name person.name // here
  email, password string
}
Salin selepas log masuk

Guna macam ni

user := User{Name: "", Email: "", Password: ""}
Salin selepas log masuk

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="//m.sbmmt.com/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="a5c7cac7e5c7cac7d6d5cad18bc6cac8">[email&#160;protected]</a>",
        password: "you're kidding right?",
    } 
Salin selepas log masuk

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="//m.sbmmt.com/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="8fede0edcfede0edfcffe0fba1ece0e2">[email&#160;protected]</a>",
    u.password = "you're kidding right?",
Salin selepas log masuk

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" }
Salin selepas log masuk
Salin selepas log masuk

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
    }
Salin selepas log masuk

Kini anda

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

baharu:

    u := user{ name: "bob" }
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk

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": ""
    }
Salin selepas log masuk

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
    }
Salin selepas log masuk
person 的编组字段名称,即使 user 没有 nameTetapi kini

disusun menjadi objek

🎜 dengan 🎜 medan: 🎜
    {
        "PersonName": {
            "Name": ""
        },
        "Name": "",
        "Email": "",
        "Password": ""
    }
Salin selepas log masuk
🎜🎜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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan