Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Init array of structs in Go

Tags:

arrays

struct

go

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?

like image 252
daniel.widyanto Avatar asked Oct 02 '14 10:10

daniel.widyanto


People also ask

How do you initialize a struct in Go?

2 ways to create and initialize a new structThe new keyword can be used to create a new struct. It returns a pointer to the newly created struct. You can also create and initialize a struct with a struct literal. An element list that contains keys does not need to have an element for each struct field.

How do I assign an array in Golang?

In Go language, arrays are mutable, so that you can use array[index] syntax to the left-hand side of the assignment to set the elements of the array at the given index. You can access the elements of the array by using the index value or by using for loop. In Go language, the array type is one-dimensional.


2 Answers

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 term const has a different meaning in Go, as it does in C. The list should be defined as var instead.
  • Secondly, as a style rule, Go prefers basenameOpts as opposed to basename_opts.
  • There is no char type in Go. You probably want byte (or rune 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.

like image 57
jimt Avatar answered Oct 26 '22 10:10

jimt


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.

like image 43
OneOfOne Avatar answered Oct 26 '22 12:10

OneOfOne