Go中的Init结构数组

dan*_*nto 49 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"}
    }
Run Code Online (Sandbox Code Playgroud)

编译器说它期待';' 在[]选择之后.

我应该把大括号'{'放到init我的struct数组中?

谢谢

jim*_*imt 74

看起来你正试图在这里使用(几乎)直接的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",
    },
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用其类型声明列表,然后使用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",
        },
    )
}
Run Code Online (Sandbox Code Playgroud)

由于您是Go的新手,我强烈建议您阅读语言规范.它很短,写得很清楚.它会为你清除很多这些小特质.

  • opt 在数组中是多余的 (7认同)

One*_*One 32

添加这个作为@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",
    },
}
Run Code Online (Sandbox Code Playgroud)

这通常也用于测试,以定义几个测试用例并循环遍历它们.


小智 5

你可以这样:

请务必注意每个结构项或项集后面的逗号。

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,
                },
            },
        },
    }
Run Code Online (Sandbox Code Playgroud)