web-dev-qa-db-fra.com

Init tableau de structs dans Go

Je suis novice à Go. Ce problème me rend fou. Comment initiez-vous un tableau de structures dans Go?

type opt struct {
    shortnm      char
    longnm, help string
    needArg      bool
}

const basename_opts []opt { 
        opt {
            shortnm: 'a', 
            longnm: "multiple", 
            needArg: false, 
            help: "Usage for a"}
        },
        opt {
            shortnm: 'b', 
            longnm: "b-option", 
            needArg: false, 
            help: "Usage for b"}
    }

Le compilateur a dit qu'il attendait ';' après [] opt.

Où devrais-je placer les accolades '{' pour initier mon tableau de struct?

Merci

47
daniel.widyanto

On dirait que vous essayez d'utiliser (presque) le code C directement ici. Go a quelques différences.

  • Tout d'abord, vous ne pouvez pas initialiser les tableaux et les tranches avec const. Le terme const a une signification différente dans Go, comme dans C. La liste doit plutôt être définie comme var.
  • Deuxièmement, comme règle de style, Go préfère basenameOpts plutôt que basename_opts.
  • Il n'y a pas de type char dans Go. Vous voulez probablement byte (ou rune si vous avez l'intention d'autoriser les points de code unicode).
  • La déclaration de la liste doit avoir l'opérateur d'affectation dans ce cas. Par exemple.: var x = foo.
  • L'analyseur de Go exige que chaque élément d'une déclaration de liste se termine par une virgule. Cela comprend le dernier élément. La raison en est que Go insère automatiquement des points-virgules, le cas échéant. Et cela nécessite une syntaxe un peu plus stricte pour fonctionner.

Par exemple:

type opt struct {
    shortnm      byte
    longnm, help string
    needArg      bool
}

var basenameOpts = []opt { 
    opt {
        shortnm: 'a', 
        longnm: "multiple", 
        needArg: false, 
        help: "Usage for a",
    },
    opt {
        shortnm: 'b', 
        longnm: "b-option", 
        needArg: false, 
        help: "Usage for b",
    },
}

Une alternative consiste à déclarer la liste avec son type puis à utiliser une fonction init pour la remplir. Cela est surtout utile si vous souhaitez utiliser les valeurs renvoyées par des fonctions dans la structure de données. Les fonctions init sont exécutées lorsque le programme est en cours d'initialisation et se termineront avant l'exécution de main. Vous pouvez avoir plusieurs fonctions init dans un même package, voire dans le même fichier source.

type opt struct {
    shortnm      byte
    longnm, help string
    needArg      bool
}

var basenameOpts []opt

func init() { 
    basenameOpts = []opt{
        opt {
            shortnm: 'a', 
            longnm: "multiple", 
            needArg: false, 
            help: "Usage for a",
        },
        opt {
            shortnm: 'b', 
            longnm: "b-option", 
            needArg: false, 
           help: "Usage for b",
        },
    )
}

Puisque vous êtes nouveau sur Go, je vous recommande fortement de lire la spécification de langue . C'est assez court et très clairement écrit. Cela effacera beaucoup de ces petites particularités pour vous.

70
jimt

En ajoutant ceci comme un ajout à l'excellente réponse de @ jimt:

un moyen courant de tout définir au moment de l’initialisation consiste à utiliser une structure anonyme:

var opts = []struct {
    shortnm      byte
    longnm, help string
    needArg      bool
}{
    {'a', "multiple", "Usage for a", false},
    {
        shortnm: 'b',
        longnm:  "b-option",
        needArg: false,
        help:    "Usage for b",
    },
}

Ceci est également couramment utilisé pour les tests afin de définir quelques scénarios de test et de les parcourir en boucle.

31
OneOfOne