小编典典

Go中的初始化结构数组

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

编译器说,它预期;[]opt

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


阅读 416

收藏
2021-12-02

共1个答案

小编典典

看起来您正在尝试在这里使用(几乎)直接的 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 的新手,我强烈建议您通读语言规范。它很短,写得很清楚。它将为您清除许多这些小特质。

2021-12-02