web-dev-qa-db-ja.com

Goの構造体の初期化配列

私は囲inの初心者です。この問題は私に夢中にさせています。 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の後。

構造体の配列を初期化するために、中括弧「{」をどこに置くべきですか?

ありがとうございました

47
daniel.widyanto

ここで(ほぼ)まっすぐなCコードを使用しようとしているようです。 Goにはいくつかの違いがあります。

  • まず、配列とスライスをconstとして初期化することはできません。 Goでは、constという用語の意味はCとは異なります。リストは、代わりにvarとして定義する必要があります。
  • 次に、スタイルルールとして、Goはbasename_optsではなくbasenameOptsを好みます。
  • Goにはcharタイプはありません。おそらくbyte(またはUnicodeコードポイントを許可する場合は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関数を含めることができます。

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は初めてなので、 言語仕様 を読むことを強くお勧めします。それはかなり短く、非常に明確に書かれています。これらの小さな特異性の多くが解消されます。

70
jimt

これを@jimtの優れた答えへの追加として追加します。

初期化時にすべてを定義する一般的な方法の1つは、匿名の構造体を使用することです。

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

これは一般にテストにも使用され、少数のテストケースを定義してループします。

31
OneOfOne