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

Простой вопрос. Как инициализировать эту структуру? Я хотел бы сделать что-то вроде этого:Отсутствует тип в составном литеральном

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

Expectedly я получаю сообщение об ошибке:

missing type in composite literal 

Конечно, я могу создать отделенные структуры B и инициализировать его таким образом:

type Btype struct { 
    Some string 
    Len int 
} 

type A struct { 
    B Btype 
} 

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

Но это не так полезно, как первый способ. Есть ли ярлык для инициализации анонимной структуры?

ответ

11

assignability rules простительно для анонимных типов, что приводит к другой возможности, когда вы можете сохранить исходное определение A, позволяя писать короткие композитные литералы этого типа. Если вы действительно настаиваете на анонимный типе для B поля, я бы, наверное, написать что-то вроде:

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


Выхода

&main.A{B:struct { Some string; Len int }{Some:"xxx", Len:3}} 
Смежные вопросы