Maison >développement back-end >Golang >Comment fournir une valeur à un littéral de structure embarquée importé ?

Comment fournir une valeur à un littéral de structure embarquée importé ?

WBOY
WBOYavant
2024-02-05 21:54:111148parcourir

Comment fournir une valeur à un littéral de structure embarquée importé ?

Contenu des questions

Je suis un débutant ici :) Je ne comprends pas

Quand je fais cela dans un fichier :

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)

}

Ça marche Mais quand j'ai 3 fichiers comme ça

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
}

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

}

Erreur :(

mixture of field:value and value elements in struct literal

Je ne comprends pas, qu’ai-je fait de mal ? Je pense que si la structure est imbriquée, on dit qu'elle est intégrée dans la structure externe et je peux accéder aux champs de la structure interne depuis la structure externe. C'est le cas de mon premier exemple (fichier unique), mais lorsque je le fais dans un package. Y a-t-il une différence ?


Bonne réponse


Je pense que si la structure est imbriquée, on dit qu'elle est incrustée dans la structure externe et je peux accéder aux champs de la structure interne depuis la structure externe.

Oui, vous pouvez accéder directement aux membres des champs intégrés, mais c'est en utilisant des littéraux composés. Si vous regardez les règles de structuration du texte, vous trouverez ce qui suit :

Si un élément a une clé, alors chaque élément doit avoir une clé.

Cette règle s'applique que le champ soit intégré ou non.

Pour corriger l'erreur, vous pouvez supprimer d'autres clés :

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

Ou vous pouvez spécifier toutes les clés :

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

Notez que pour les champs incorporés, vous pouvez référencer le champ incorporé en utilisant le nom non qualifié du type.

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

Les champs déclarés avec un type mais sans nom de champ explicite sont appelés champs intégrés. Les champs intégrés doivent être spécifiés sous forme de noms de types t 或指向非接口类型名称 *t 的指针,并且 t qui ne peuvent pas eux-mêmes être des types de pointeurs. Les noms de types non qualifiés font office de noms de champs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer