web-dev-qa-db-fra.com

Initialiser la définition de structure imbriquée dans Golang

Comment initialisez-vous la structure suivante?

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

j'ai essayé:

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

n'a pas fonctionné:

mixture of field:value and value initializers
undefined: Contact

j'ai essayé:

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

n'a pas fonctionné:

undefined: Contact
39
Kiril

Votre Contact est un champ de type struct anonyme. En tant que tel, vous devez répéter la définition de type:

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

Mais dans la plupart des cas, il est préférable de définir un type distinct comme le propose rob74.

54
Ainar-G

Que diriez-vous de définir les deux structures séparément, puis d'incorporer "Contact" dans "Expéditeur"?

type Sender struct {
    BankCode string
    Name     string
    Contact
}

type Contact struct {
    Name  string
    Phone string
}

si vous le faites de cette façon, votre deuxième tentative d'initialisation fonctionnera. De plus, vous pouvez utiliser "Contact" seul.

Si vous voulez vraiment utiliser la structure imbriquée, vous pouvez utiliser la réponse d'Ainar-G, mais cette version n'est pas jolie (et elle devient encore plus laide si les structures sont profondément imbriquées, comme indiqué ici ), donc je ne ferais pas ça si ça peut être évité.

32
rob74
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",
}
3
Eduardo Nunes