Go では、for ループの初期化子として構造体式を使用すると、コンパイル中に構文エラーが発生する可能性があります。構造体へのポインタは許容されますが、構造式を通じて宣言されたローカル変数は問題を引き起こす可能性があります。
次のコード スニペットを検討してください:
type Request struct { id int line []byte err error } go func() { for r := Request{}; r.err == nil; r.id++ { r.line, r.err = input.ReadSlice(0x0a) channel <- r } }()
このコードはコンパイル時エラーをトリガーします: "expected"ブール式または範囲式、単純なステートメントが見つかりました (複合リテラルを囲む括弧がありません?)。このあいまいさは、左中括弧 { が複合リテラルの先頭または for ブロックの左中括弧のいずれかとして解釈される可能性があるために発生します。
この曖昧さを解決するには、構造式を括弧で囲み、次のことを明確にします。これは複合リテラルです:
for r := (Request{}); r.err == nil; r.id++ { r.line, r.err = input.ReadSlice(0x0a) channel <- r }
この変更により、コードは正常にコンパイルされ、意図したとおりに実行され、ローカル変数 r が初期化されます。新しい Request 構造体を使用し、反復ごとにその ID 値をインクリメントします。
以上が構造式初期化子で Go `for` ループが失敗する理由とその修正方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。