3

for、func、またはifステートメントに続くgoブロックは、同じ行に開始中括弧を付ける必要がありますか?下に移動するとコンパイルエラーが発生しますが、言語仕様では、ブロックをそのように構造化する必要があることを示しています。

ブロックは、一致する中括弧内の一連の宣言とステートメントです。

ブロック="{"{ステートメント";" }"}"。

IfStmt = "if" [SimpleStmt ";" ]式ブロック["else"(IfStmt | Block)]。

4

1 に答える 1

3

セミコロン推論のため、Effective Goから:

1つの警告。
制御構造の開始中括弧(if、for、switch、またはselect)を次の行に配置しないでください。
これを行うと、ブレースの前にセミコロンが挿入され、望ましくない影響が生じる可能性があります。次のように書いてください。

if i < f() {
    g()
}

このようではありません:

if i < f()  // wrong!
{           // wrong!
    g()
}

jnmlがコメントしているように、言語構文はブロックに対して正しいです
しかし、セミコロン注射と組み合わせると、それはあなたが本当にすべきであることを意味します:

  • 常に中括弧をifステートメントと同じ行に配置します(または' if'はあなたが思っていることをしません)
  • 実際には、常に使用gofmtし、考えないでください(できれば、エディターに保存するたびにコードをgofmtします。高速で、他のGoコードと一貫性のあるコードになります

Goコンパイラでさえ、予期しない副作用を回避するために、その「中括弧の同じ行」ルールを適用します。
したがって、言語リファレンスには中括弧を配置する場所は記載されていませんが、とコンパイラの両方が、ステートメントgofmtに対して正しく配置されていることを確認します。if

于 2012-07-23T06:56:24.037 に答える