我是Go的新手。这个问题让我疯了。你如何在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"}
}
编译器说它期待';'在[]选择之后
我应该把大括号'{'放到init我的struct数组中?
谢谢
答案 0 :(得分:61)
看起来你正试图在这里使用(几乎)直接的C代码。 Go有一些差异。
const
。术语const
在Go中具有不同的含义,与在C中的含义不同。列表应定义为var
。basenameOpts
而不是basename_opts
。char
类型。如果您打算允许unicode代码点,您可能需要byte
(或rune
。var x = foo
。例如:
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
函数,甚至可以在同一源文件中使用。{/ p>
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",
},
)
}
由于您是Go的新手,我强烈建议您阅读the language specification。它很短,写得很清楚。它会为你清除很多这些小特质。
答案 1 :(得分:25)
将此添加为@ 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",
},
}
这通常用于测试以定义少数测试用例并循环遍历它们。
答案 2 :(得分:1)
您可以这样:
在每个struct项目或项目集之后注意逗号很重要。
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,
},
},
},
}