2014-11-11 30 views
26

Come si inizializza la seguente struttura?Inizializza la definizione di struct nidificata in Golang

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

ho provato:

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

non ha funzionato:

mixture of field:value and value initializers 
undefined: Contact 

ho provato:

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

non ha funzionato:

undefined: Contact 

risposta

36

Il tuo Contact è un campo con tipo di struttura anonimo. Come tale, è necessario ripetere la definizione del tipo:

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

Ma nella maggior parte dei casi è meglio definire un tipo distinto come proposto rob74.

+2

Ok, questa sembra essere la risposta giusta, ma come dici tu la risposta di rob74 è più elegante. – Kiril

24

Come circa la definizione dei due struct separatamente e poi embedding "Contatto" in "mittente"?

type Sender struct { 
    BankCode string 
    Name  string 
    Contact 
} 

type Contact struct { 
    Name string 
    Phone string 
} 

se lo fai in questo modo, il tuo secondo tentativo di inizializzazione funzionerebbe. Inoltre, è possibile utilizzare "Contatto" da solo.

Se si vuole veramente utilizzare la struttura nidificata, è possibile utilizzare la risposta di Ainar-G, ma questa versione non è carina (e diventa ancora più brutta se le strutture sono profondamente annidate, come mostrato here), quindi non lo farei Lo faccia se può essere evitato.

+0

Questa è un'altra opzione, ma voglio solo sapere come inizializzare una struttura nidificata. – Kiril

+1

La tua risposta è un modo migliore per risolvere la definizione di struct annidata, ma la risposta di Ainar-G è quella giusta per la mia domanda. – Kiril

1
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", 
} 
Problemi correlati