在Golang中初始化嵌套的结构定义

时间:2014-11-11 14:13:18

标签: struct go initialization

如何初始化以下结构?

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

我试过了:

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

无效:

mixture of field:value and value initializers
undefined: Contact

我试过了:

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

无效:

undefined: Contact

3 个答案:

答案 0 :(得分:54)

您的Contact是一个具有匿名结构类型的字段。因此,您必须重复类型定义:

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

但在大多数情况下,最好将rob74定义为单独的类型。

答案 1 :(得分:30)

如何单独定义两个结构,然后在“发件人”中嵌入“联系人”?

type Sender struct {
    BankCode string
    Name     string
    Contact
}

type Contact struct {
    Name  string
    Phone string
}

如果你这样做,你的第二次初始化尝试将起作用。此外,您可以单独使用“联系人”。

如果你真的想使用嵌套结构,你可以使用Ainar-G的答案,但是这个版本并不漂亮(如果结构深度嵌套,它会变得更加丑陋,如图here所示),所以如果可以避免,我就不会这样做。

答案 2 :(得分: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",
}