web-dev-qa-db-fra.com

Type manquant dans le littéral composite

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

Question simple. Comment initialiser cette structure? Je voudrais faire quelque chose comme ça:

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

J'obtiens probablement une erreur:

missing type in composite literal

Bien sûr, je peux créer une structure B séparée et l'initialiser de cette façon:

type Btype struct {
    Some string
    Len int
}

type A struct {
    B Btype
}

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

Mais ce n'est pas aussi utile que la première façon. Existe-t-il un raccourci pour initialiser la structure anonyme?

24
tacobot

Les règles d'attribution pardonnent aux types anonymes, ce qui conduit à une autre possibilité où vous pouvez conserver la définition originale de A tout en permettant l'écriture de littéraux composites courts de ce type. Si vous insistez vraiment sur un type anonyme pour le champ B, j'écrirais probablement quelque chose comme:

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

Aire de jeux


Production

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