2013-07-28 10 views
14
type A struct { 
    B struct { 
     Some string 
     Len int 
    } 
} 

Proste pytanie. Jak zainicjować tę strukturę? Chciałbym zrobić coś takiego:Brakujący typ w literaturze kompozytowej

a := &A{B:{Some: "xxx", Len: 3}} 

Zgodnie z oczekiwaniami Dostaję błąd:

missing type in composite literal 

Oczywiście, można utworzyć oddzielną struct B i zainicjować w ten sposób:

type Btype struct { 
    Some string 
    Len int 
} 

type A struct { 
    B Btype 
} 

a := &A{B:Btype{Some: "xxx", Len: 3}} 

Ale to nie jest tak użyteczne, jak pierwszy sposób. Czy istnieje skrót do inicjowania anonimowej struktury?

Odpowiedz

11

Dla typów anonimowych są one wybaczalne, co prowadzi do innej możliwości, w której można zachować oryginalną definicję A, umożliwiając zapisywanie krótkich literałów złożonych tego typu. Jeśli naprawdę nalegać na anonimowego typu dla pola B, prawdopodobnie napisać coś takiego:

package main 

import "fmt" 

type (
     A struct { 
       B struct { 
         Some string 
         Len int 
       } 
     } 

     b struct { 
       Some string 
       Len int 
     } 
) 

func main() { 
     a := &A{b{"xxx", 3}} 
     fmt.Printf("%#v\n", a) 
} 

Playground


Output

&main.A{B:struct { Some string; Len int }{Some:"xxx", Len:3}}