Init array of structs in 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?

211348 次浏览

看起来你正在尝试使用(几乎)直接的 C 代码。

  • 首先,不能将数组和切片初始化为 const。术语 const在 Go 中有不同的含义,就像在 C 中一样。这个列表应该被定义为 var
  • 其次,作为一种风格规则,围棋更喜欢 basenameOpts而不是 basename_opts
  • There is no char type in Go. You probably want byte (or rune if you intend to allow unicode codepoints).
  • 在这种情况下,列表的声明必须具有赋值操作符。例如: var x = foo
  • Go 的解析器要求列表声明中的每个元素都以逗号结束。 这包括最后一个元素,原因是 Go 会自动插入 semi-colons where needed. And this requires somewhat stricter syntax in order to work.

例如:

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",
},
}

另一种方法是使用类型声明列表,然后使用 init函数填充它。如果您打算使用数据结构中函数返回的值,那么这种方法非常有用。init函数在程序初始化时运行,并保证在执行 main之前完成。您可以在一个包中有多个 init函数,甚至在同一个源文件中也可以有多个 init函数。

    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",
},
}
}

因为你是围棋新手,我强烈建议你通读 语言规范。它非常简短,而且写得非常清楚。这会让你清楚很多这些小特质。

在@jimt 的精彩回答中加入以下内容:

在初始化时定义它的一种常见方法是使用匿名结构:

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",
},
}

这通常用于测试以及定义少量测试用例并循环通过它们。

你可以这样想:

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

我是在搜索如何初始化一个结构片时得到这个答案的。我自己使用 Go 只有几个月,所以我不确定这个问题出现的时候是否正确,或者它只是一个新的更新,但是它不(不再)需要重新声明类型。参见@jimt 示例的重构版本

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",
},
}