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 ?
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!