web-dev-qa-db-ja.com

Golangが中括弧を次の行にないようにするのはなぜですか?

正しい:

if(true) {

}

正しくない:

if(true)
{

}

なぜこのスタイルが強制されるのですか、それは言語仕様と関係があるのですか、それとも単にあるスタイルが別のスタイルよりも好まれているからですか?

28
jokoon

中括弧があるのにセミコロンがないのはなぜですか?そして、なぜ私は次の行に開き括弧を置くことができないのですか?

Goは、Cファミリーの任意の言語で作業したプログラマーが使い慣れた構文であるステートメントのグループ化に中括弧を使用しています。ただし、セミコロンはパーサーのためのものであり、人のためのものではないので、できるだけ削除したいと考えました。この目標を達成するために、GoはBCPLからトリックを借用しています。ステートメントを区切るセミコロンは正式な文法の中にありますが、ステートメントの終わりとなる可能性のある行の終わりにあるレクサーによって、先読みなしで自動的に挿入されます。これは実際には非常にうまく機能しますが、ブレーススタイルを強制する効果があります。たとえば、関数の左中括弧はそれ自体では行に表示できません。

http://golang.org/doc/faq#semicolons

40
Matt Ball

ほとんどの[〜#〜] c [〜#〜]降順言語はif ( <condition> ) <statement>statementのスタイルを使用しますconditionがtrueの場合に実行されます。 statementは、単一のステートメントまたは中括弧で囲まれたブロックのいずれかです。

Goのifステートメントには、単一のステートメントではなく、次の中括弧で囲まれたブロックが必要です。これは 一般的なエラー を回避するためです。ほとんどのスタイルガイドでは、すべてのifステートメントで中かっこを使用する必要があるため、これを回避しようとしています。

//subtle error in C
if (<condition>)
  <statement1>;
  <statement2>;

Goはifステートメントに続くブレースブロックを必要とするため、()は冗長です。これらは、字句解析プログラムが条件とステートメントを区別するのに役立つだけであり、そうでない場合、if <condition> <statement>は解析が困難です。 (条件はどこで終わり、ステートメントはどこで始まりますか?)

さて、Goの作者は次のことを決定します。

  • 冗長性を保つ()
  • {をフォローするには<condition>が必要

冗長性は望ましくないと判断しました。これには2番目の副作用がありました。すべての改行に暗黙の;があるため、{が次の行にある場合、;<condition>{の間に置かれます。 Goの作者は再び決定に直面しています。

  • パーサーが<condition>; {構成について賢くする特別な場合
  • 全員が同じ行にif ... {の共通のスタイルを採用する必要があります。
  • <condition>が1行にある必要があります。

パーサーの特別なケーシングは非常に悪い悪いことです。 C++のひどいパーサーパフォーマンスと比較した速度[〜#〜] d [〜#〜]とGoパーサーを見てください。制服もいいですね。制約があれば、最終的な決定は非常に簡単です。

25
deft_code

このブレースフォーシングは、K&Rスタイルを愛する人々がAllmanスタイルを見る必要がないようにするための言い訳にすぎないと思います。デザイナーがオールマンスタイルを気に入ったとしたら、デザイナーは単にパーサーにそれを処理させるでしょう。 XMLがK&Rで記述されていると想像してみてください。理解するのは不可能に見えるでしょう。オールマンスタイルの方が読みやすく、読みやすくなっています。これは完全に感情的な決定のようです。私も1つ作成します。Goは無視してください。

22
Mike

Spec と関係があります。つまり、コンパイラに組み込まれたものだけではありません。

セミコロン

正式な文法ではセミコロン「;」を使用します。多くの作品のターミネーターとして。 Goプログラムでは、次の2つのルールを使用して、これらのセミコロンのほとんどを省略できます。

入力がトークンに分割されると、行の最後のトークンが次の場合、非空白行の終わりにセミコロンがトークンストリームに自動的に挿入されます。

  • 識別子
  • 整数、浮動小数点、虚数、ルーン、または文字列リテラル
  • キーワードbreak、continue、fallthrough、またはreturnのいずれか
  • 演算子と区切り文字++、-、)、]、または}のいずれか

複雑なステートメントを1行で使用できるようにするには、セミコロンを閉じて ")"または "}"を閉じる前に省略できます。

慣用的な使用を反映するために、このドキュメントのコード例では、これらのルールを使用してセミコロンを省略しています。

私が彼らの話からそれを把握した限り、彼らはフォーマットの議論を取り除くことを望み、そして gofmt の偉大さでアイデアを拡張しました

6
tike