Init array of structs in Go
ArraysStructGoArrays Problem Overview
I'm newbie in Go. This issue is driving me nuts. How do you init array of structs in 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"}
}
The compiler said it expecting ;
after []opt
.
Where should I put the braces {
to init my array of struct?
Arrays Solutions
Solution 1 - Arrays
It looks like you are trying to use (almost) straight up C code here. Go has a few differences.
- First off, you can't initialize arrays and slices as
const
. The termconst
has a different meaning in Go, as it does in C. The list should be defined asvar
instead. - Secondly, as a style rule, Go prefers
basenameOpts
as opposed tobasename_opts
. - There is no
char
type in Go. You probably wantbyte
(orrune
if you intend to allow unicode codepoints). - The declaration of the list must have the assignment operator in this case. E.g.:
var x = foo
. - Go's parser requires that each element in a list declaration ends with a comma. This includes the last element. The reason for this is because Go automatically inserts semi-colons where needed. And this requires somewhat stricter syntax in order to work.
For example:
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",
},
}
An alternative is to declare the list with its type and then use an init
function to fill it up. This is mostly useful if you intend to use values returned by functions in the data structure. init
functions are run when the program is being initialized and are guaranteed to finish before main
is executed. You can have multiple init
functions in a package, or even in the same source file.
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",
},
}
}
Since you are new to Go, I strongly recommend reading through the language specification. It is pretty short and very clearly written. It will clear a lot of these little idiosyncrasies up for you.
Solution 2 - Arrays
Adding this just as an addition to @jimt's excellent answer:
one common way to define it all at initialization time is using an anonymous struct:
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",
},
}
This is commonly used for testing as well to define few test cases and loop through them.
Solution 3 - Arrays
You can have it this way:
It is important to mind the commas after each struct item or set of items.
earnings := []LineItemsType{
LineItemsType{
TypeName: "Earnings",
Totals: 0.0,
HasTotal: true,
items: []LineItems{
LineItems{
name: "Basic Pay",
amount: 100.0,
},
LineItems{
name: "Commuter Allowance",
amount: 100.0,
},
},
},
LineItemsType{
TypeName: "Earnings",
Totals: 0.0,
HasTotal: true,
items: []LineItems{
LineItems{
name: "Basic Pay",
amount: 100.0,
},
LineItems{
name: "Commuter Allowance",
amount: 100.0,
},
},
},
}
Solution 4 - Arrays
I came across this answer while searching for how to initialize a slice of structs. I've been working with Go just a few months myself so I'm not sure if this was true at the time of the question or its just a new update but its not(no longer) necessary to restate the type. See a refactored version of @jimt's example
type opt struct {
shortnm byte
longnm, help string
needArg bool
}
var basenameOpts = []opt {
{
shortnm: 'a',
longnm: "multiple",
needArg: false,
help: "Usage for a",
},
{
shortnm: 'b',
longnm: "b-option",
needArg: false,
help: "Usage for b",
},
}