Go中的结构初始化数组


76

我是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"}
    }

编译器表示希望;在之后[]opt

我应该在哪里把大括号{初始化结构数组?

Answers:


111

看来您正在此处尝试(几乎)直接使用C代码。Go有一些区别。

  • 首先,您无法将数组和切片初始化为const。该术语const在Go中的含义与在C中的含义不同。列表应var改为。
  • 其次,作为一种样式规则,Go倾向于basenameOpts而不是basename_opts
  • charGo中没有类型。您可能想要byte(或者rune如果您打算允许unicode代码点)。
  • 在这种情况下,列表的声明必须具有赋值运算符。例如: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一个包甚至同一源文件中都可以具有多个功能。

    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语言,因此我强烈建议您仔细阅读语言规范。它很短,写得很清楚。它将为您清除许多这些小特质。


45

将此添加为@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",
    },
}

这也常用于测试,以定义一些测试用例并遍历它们。


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,
                },
            },
        },
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.