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
On dirait que vous essayez d'utiliser (presque) le code C directement ici. Go a quelques différences.
const
. Le terme const
a une signification différente dans Go, comme dans C. La liste doit plutôt être définie comme var
.basenameOpts
plutôt que basename_opts
.char
dans Go. Vous voulez probablement byte
(ou rune
si vous avez l'intention d'autoriser les points de code unicode).var x = foo
.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.
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.