Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk memberikan nilai kepada struktur terbenam yang diimport secara literal?

Bagaimana untuk memberikan nilai kepada struktur terbenam yang diimport secara literal?

WBOY
Lepaskan: 2024-02-05 21:54:11
ke hadapan
1127 orang telah melayarinya

Bagaimana untuk memberikan nilai kepada struktur terbenam yang diimport secara literal?

Kandungan soalan

Saya newbie di sini :) Tak faham

Apabila saya melakukan ini dalam fail:

scratch.go

package main

import "fmt"

type foo struct {
    field1 string
    field2 string
}

type bar struct {
    foo
    field3 string
    field4 string
}

func main() {
    foobar := bar{
        foo{
            "apples",
            "banana",
        },
        "spam",
        "eggs",
    }
    fmt.printf("%#v\n", foobar)

}
Salin selepas log masuk

Ia berkesan Tapi bila dah ada 3 file macam ni

rootproject
├── magazine
│   ├── address.go
│   └── employee.go
└── main.go
Salin selepas log masuk

magazine/address.go

package magazine

type address struct {
    street     string
    city       string
    state      string
    postalcode string
}
Salin selepas log masuk

magazine/employee.go

package magazine

type employee struct {
    name   string
    salary float64
    address
}
Salin selepas log masuk

dan main.go

package main

import (
    "fmt"
    "magazine"
)

func main() {
    employee := magazine.employee{
        name:   "pogi",
        salary: 69420,
        magazine.address{
            street:     "23 pukinginamo st.",
            city:       "bactol city",
            state:      "betlog",
            postalcode: "23432",
        },
    }

    fmt.printf("%#v\n", employee)

}
Salin selepas log masuk

Ralat :(

mixture of field:value and value elements in struct literal
Salin selepas log masuk

Saya tidak faham, apa salah saya? Saya fikir jika struktur itu bersarang, ia dikatakan tertanam dalam struktur luar dan saya boleh mengakses medan struktur dalam dari struktur luar. Ini adalah kes dengan contoh pertama saya (fail tunggal), tetapi apabila saya melakukan ini dalam pakej. Adakah terdapat perbezaan?


Jawapan betul


Saya rasa jika struktur itu bersarang, ia dikatakan tertanam dalam struktur luar dan saya boleh mengakses medan struktur dalam dari struktur luar.

Ya, anda boleh mengakses ahli medan terbenam secara langsung, tetapi ini adalah apabila menggunakan huruf majmuk. Jika anda melihat peraturan untuk menstruktur teks, anda akan mendapati perkara berikut:

Jika mana-mana elemen mempunyai kunci, maka setiap elemen mesti mempunyai kunci.

Peraturan ini terpakai sama ada medan dibenamkan atau tidak.

Untuk membetulkan ralat anda boleh mengalih keluar kekunci lain:

func main() {
    employee := magazine.employee{
        "pogi",
        69420,
        magazine.address{
            street:     "23 pukinginamo st.",
            city:       "bactol city",
            state:      "betlog",
            postalcode: "23432",
        },
    }
    fmt.printf("%#v\n", employee)
}
Salin selepas log masuk

Atau anda boleh menentukan semua kunci:

func main() {
    employee := magazine.Employee{
        Name:   "pogi",
        Salary: 69420,
        Address: magazine.Address{
            Street:     "23 pukinginamo st.",
            City:       "bactol city",
            State:      "betlog",
            PostalCode: "23432",
        },
    }
    fmt.Printf("%#v\n", employee)
}
Salin selepas log masuk

Perhatikan bahawa untuk medan terbenam, anda boleh merujuk medan terbenam menggunakan nama jenis yang tidak layak.

https://www.php.cn/link/2eeb0ca3f02a275d5179f3b6d9e86e7d

Medan yang diisytiharkan dengan jenis tetapi tanpa nama medan yang jelas dipanggil medan terbenam. Medan terbenam mesti dinyatakan sebagai nama jenis t 或指向非接口类型名称 *t 的指针,并且 t yang mungkin bukan jenis penunjuk. Nama jenis tidak layak bertindak sebagai nama medan.

Atas ialah kandungan terperinci Bagaimana untuk memberikan nilai kepada struktur terbenam yang diimport secara literal?. 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