私は囲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の後。
構造体の配列を初期化するために、中括弧「{」をどこに置くべきですか?
ありがとうございました
ここで(ほぼ)まっすぐなCコードを使用しようとしているようです。 Goにはいくつかの違いがあります。
const
として初期化することはできません。 Goでは、const
という用語の意味はCとは異なります。リストは、代わりにvar
として定義する必要があります。basename_opts
ではなくbasenameOpts
を好みます。char
タイプはありません。おそらくbyte
(またはUnicodeコードポイントを許可する場合はrune
)が必要でしょう。var x = foo
。例えば:
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は初めてなので、 言語仕様 を読むことを強くお勧めします。それはかなり短く、非常に明確に書かれています。これらの小さな特異性の多くが解消されます。
これを@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",
},
}
これは一般にテストにも使用され、少数のテストケースを定義してループします。