Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann einem importierten eingebetteten Strukturliteral ein Wert bereitgestellt werden?

Wie kann einem importierten eingebetteten Strukturliteral ein Wert bereitgestellt werden?

WBOY
WBOYnach vorne
2024-02-05 21:54:111108Durchsuche

Wie kann einem importierten eingebetteten Strukturliteral ein Wert bereitgestellt werden?

Frageninhalt

Ich bin hier ein Neuling :) Ich kann es nicht verstehen

Wenn ich das in einer Datei mache:

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)

}

Es funktioniert Aber wenn ich 3 solcher Dateien habe

rootproject
├── magazine
│   ├── address.go
│   └── employee.go
└── main.go

magazine/address.go

package magazine

type address struct {
    street     string
    city       string
    state      string
    postalcode string
}

magazine/employee.go

package magazine

type employee struct {
    name   string
    salary float64
    address
}

und 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)

}

Fehler:(

mixture of field:value and value elements in struct literal

Ich verstehe nicht, was habe ich falsch gemacht? Ich denke, wenn die Struktur verschachtelt ist, sagt man, dass sie in die äußere Struktur eingebettet ist und ich von der äußeren Struktur aus auf die Felder der inneren Struktur zugreifen kann. Dies ist bei meinem ersten Beispiel (einzelne Datei) der Fall, aber wenn ich dies in einem Paket mache. Gibt es einen Unterschied?


Richtige Antwort


Ich denke, wenn die Struktur verschachtelt ist, sagt man, dass sie in die äußere Struktur eingebettet ist und ich von der äußeren Struktur aus auf die Felder der inneren Struktur zugreifen kann.

Ja, Sie können direkt auf Mitglieder eingebetteter Felder zugreifen, aber dies geschieht, wenn Sie zusammengesetzte Literale verwenden. Wenn Sie sich die Regeln zur Textstrukturierung ansehen, werden Sie Folgendes feststellen:

Wenn ein Element einen Schlüssel hat, muss jedes Element einen Schlüssel haben.

Diese Regel gilt unabhängig davon, ob das Feld eingebettet ist oder nicht.

Um den Fehler zu beheben, können Sie andere Schlüssel entfernen:

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)
}

Oder Sie können alle Schlüssel angeben:

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)
}

Beachten Sie, dass Sie bei eingebetteten Feldern mit dem unqualifizierten Namen des Typs auf das eingebettete Feld verweisen können.

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

Felder, die mit einem Typ, aber ohne expliziten Feldnamen deklariert wurden, werden als eingebettete Felder bezeichnet. Eingebettete Felder müssen als Typnamen t 或指向非接口类型名称 *t 的指针,并且 t angegeben werden, die selbst möglicherweise keine Zeigertypen sind. Unqualifizierte Typnamen fungieren als Feldnamen.

Das obige ist der detaillierte Inhalt vonWie kann einem importierten eingebetteten Strukturliteral ein Wert bereitgestellt werden?. 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