Initialize nested struct definition

52,260

Solution 1

Your Contact is a field with anonymous struct type. As such, you have to repeat the type definition:

s := &Sender{
    BankCode: "BC",
    Name:     "NAME",
    Contact: struct {
        Name  string
        Phone string
    }{
        Name:  "NAME",
        Phone: "PHONE",
    },
}

But in most cases it's better to define a separate type as rob74 proposed.

Solution 2

How about defining the two structs separately and then embedding "Contact" in "Sender"?

type Sender struct {
    BankCode string
    Name     string
    Contact
}

type Contact struct {
    Name  string
    Phone string
}

if you do it this way, your second initialization attempt would work. Additionally, you could use "Contact" on its own.

If you really want to use the nested struct, you can use Ainar-G's answer, but this version isn't pretty (and it gets even uglier if the structs are deeply nested, as shown here), so I wouldn't do that if it can be avoided.

Solution 3

type NameType struct {
    First string
    Last  string
}
type UserType struct {
    NameType
    Username string
}

user := UserType{NameType{"Eduardo", "Nunes"}, "esnunes"}

// or

user := UserType{
    NameType: NameType{
        First: "Eduardo",
        Last:  "Nunes",
    },
    Username: "esnunes",
}
Share:
52,260
Kiril
Author by

Kiril

Keep it simple

Updated on February 24, 2020

Comments

  • Kiril
    Kiril over 4 years

    How do you initialize the following struct?

    type Sender struct {
        BankCode string
        Name     string
        Contact  struct {
            Name    string
            Phone   string
        }
    }
    

    I tried:

    s := &Sender{
            BankCode: "BC",
            Name:     "NAME",
            Contact {
                Name: "NAME",
                Phone: "PHONE",
            },
        }
    

    Didn't work:

    mixture of field:value and value initializers
    undefined: Contact
    

    I tried:

    s := &Sender{
            BankCode: "BC",
            Name:     "NAME",
            Contact: Contact {
                Name: "NAME",
                Phone: "PHONE",
            },
        }
    

    Didn't work:

    undefined: Contact