Home  >  Article  >  Backend Development  >  How to provide a value to an imported embedded structure literal?

How to provide a value to an imported embedded structure literal?

WBOY
WBOYforward
2024-02-05 21:54:111057browse

How to provide a value to an imported embedded structure literal?

Question content

This is a newbie:) I can not understand

When I do this in a file:

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)

}

It works But when I have 3 files like this

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
}

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

}

mistake:(

mixture of field:value and value elements in struct literal

I don't understand, what did I do wrong? I think if the structure is nested, it is said to be embedded in the outer structure and I can access the inner structure's fields from the outer structure. This is the case with my first example (single file), but when I do this in a package. Is there any difference?


Correct answer


I think if the structure is nested, it is said to be embedded in the outer structure and I can access the fields of the inner structure from the outer structure .

Yes, you can directly access members of an embedded field, but this is done using compound literals. If you look at the rules for structured literals, you'll find the following:

If any element has a key, then every element must have a key.

This rule applies regardless of whether the field is embedded or not.

To fix the error, you can delete other keys:

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

Or you can specify all keys:

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

Note that for embedded fields, you can reference the embedded field using the unqualified name of the type.

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

Fields declared with a type but without an explicit field name are called embedded fields. Embedded fields must be specified as type names t or pointers to non-interface type names *t, and t itself may not be a pointer type. Unqualified type names act as field names.

The above is the detailed content of How to provide a value to an imported embedded structure literal?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete