Go中的Init结构数组

时间:2014-10-02 10:59:44

标签: arrays struct go

我是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数组中?

谢谢

3 个答案:

答案 0 :(得分:61)

看起来你正试图在这里使用(几乎)直接的C代码。 Go有一些差异。

  • 首先,您无法将数组和切片初始化为const。术语const在Go中具有不同的含义,与在C中的含义不同。列表应定义为var
  • 其次,作为一种风格规则,Go更喜欢basenameOpts而不是basename_opts
  • Go中没有char类型。如果您打算允许unicode代码点,您可能需要byte(或rune
  • 在这种情况下,列表的声明必须具有赋值运算符。例如:var x = foo
  • Go的解析器要求列表声明中的每个元素都以逗号结尾。 这包括最后一个元素。原因是因为Go会自动插入 需要时的分号。这需要更严格的语法才能工作。

例如:

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