1. ホーム
  2. go

[解決済み] Golangで長い行を改行するには?

2022-07-03 04:34:40

質問

Pythonから来た私は、80カラムより長いコード行を見るのに慣れていません。 だから、私はこれに遭遇したとき。

err := database.QueryRow("select * from users where user_id=?", id).Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email)

に分解してみました。

err := database.QueryRow("select * from users where user_id=?", id) \
    .Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email)

しかし、私は

 syntax error: unexpected \

また、エンターキーで改行して、最後にセミコロンをつけてみました。

err := database.QueryRow("select * from users where user_id=?", id) 
.Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email);

しかし、I再び取得します。

syntax error: unexpected .

ということで、golangicな方法は何だろうと考えています。

どのように解決するのですか?

まず、背景を説明します。囲碁の正式な文法では、セミコロン ";" を終端記号として使用しますが、Go プログラムではそのほとんどを省略することができます (そして、より明確で読みやすいソースを作成するためには省略すべきです)。 gofmt は不要なセミコロンも削除します)。

仕様書には、正確なルールが記載されています。 仕様書 セミコロン。

<ブロッククオート

形式文法では、多くのプロダクションでセミコロン ";" をターミネーターとして使用しています。Goプログラムでは、以下の2つのルールにより、これらのセミコロンのほとんどを省略することができます。

  1. 入力がトークンに分割されるとき、行の最後のトークンの直後にセミコロンが自動的に挿入されます(そのトークンが

  2. 複雑なステートメントが1行を占めるようにするために、閉じる ")" または "}" の前にセミコロンを省略することができます。

というわけで、括弧の後に改行文字を入れると、ご覧のように ) の後に改行を入れると、セミコロン ; が自動的に挿入されるため、次の行は前の行の続きとして扱われません。あなたの場合、このようなことが起こったので、次の行は .Scan(&ReadUser.ID,... で始まる次の行は、このように立っているとコンパイル時のエラーになります。 自体 (前の行なし)はコンパイルタイムエラーになります。 syntax error: unexpected .

というわけで、以下のルールに抵触しない任意の位置で改行することができます。 1. に記載されているルールに抵触しない場所であれば、どのような箇所でも改行できます。

通常、コンマの後で改行します。 , の後、あるいは 括弧 例 ( , [ , { で、ドットの後に . のように、何らかの値のフィールドやメソッドを参照している可能性があります。また、二項演算子(2つのオペランドを必要とするもの)の後でも改行することができます。

i := 1 +
        2
fmt.Println(i) // Prints 3

ここで注目すべきは、構造体やスライス、マップリテラルに初期値を列挙し、最後の値を列挙した後に改行したい場合、必須のコンマである , を付けなければなりません。

s := []int {
    1, 2, 3,
    4, 5, 6,  // Note it ends with a comma
}

これはセミコロンの規則に合わせるためで、また、最後のコンマの追加や削除を気にせずに行を並べ替えたり新しい行を追加したりできるようにするためです。例えば、コンマを削除したり新たに追加したりせずに2行を単に入れ替えることができます。

s := []int {
    4, 5, 6,
    1, 2, 3,
}

関数呼び出しの引数を列挙する場合も同様です。

fmt.Println("first",
    "second",
    "third",       // Note it ends with a comma
)