Подтвердить что ты не робот

Отсутствующий тип в составном литерале

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

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

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

Ожидается, что я получаю сообщение об ошибке:

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}}

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

4b9b3361

Ответ 1

правила присваивания прощаются за анонимные типы, что приводит к другой возможности, когда вы можете сохранить исходное определение 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)
}

Игровая площадка


Выход

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