Golangで長いコード行を改行する方法は?


107

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 \

Enterキーを押して改行し、最後にセミコロンを付けてみました。

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

しかし、私は再び得ます:

syntax error: unexpected .

だから私はそうするためのゴランの方法は何だろうと思いますか?

回答:


121

最初にいくつかの背景。Goの正式な文法では";"、多くのプロダクションでターミネータとしてセミコロンを使用していますが、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
)

3
JavaScriptリテラルの最後にコンマを付け続けます。#hatejs
Paulo Scardine、2016年

26
TL; DR:通常はコンマの後,,カッコ例えば(、[開いた後、{、ドットの後に自分のラインを破ることができるいくつかの値のフィールドやメソッドを参照することができる。。
Peeter Kokk

2
最後にコンマを追加しなければならないことは、いくつかの古いIE jsバグを思い出させます。ひどいものです
Christophe Roussy

4
@ChristopheRoussy主観的です。私はすべての行がカンマで終わる必要があることを愛しています。カンマの追加/削除を気にすることなく、簡単に新しい行を再配置および追加できます。
icza

@icza、私もカンマで終わるのが好きですが、最後のカンマでそれを行う必要はありません:)
Christophe Roussy

22

最も簡単な方法は.、最初の行に演算子()を残すだけです。

\ 行の継続も多くのpythonスタイルガイドでは推奨されていません。goとpythonの間で前後に移動している場合は、式全体を括弧で囲むことができます。この手法は両方の言語で機能します。


オペレーターを最後に残すことについての良いヒント。出来た。
Karlom、2016年

1
括弧で囲むとgo afaikでは機能しません。かっこ内にセミコロンを挿入してください
Adrian Shum

私はそれを試してみました、そしてGoは本当に括弧の中にさえ、見えないセミコロンを挿入します。したがって、これはPythonではのみ機能し、Goでは機能しません。
Roland Illig

@RolandIlligこれは間違いなく動作します:play.golang.org/p/oFKaxLTphU
tobyodavies

申し訳ありませんが、括弧の使用について言及していました(しかし、それは書きませんでした)。式を括弧で囲むと、Pythonでは機能しますが、Goでは機能しません。
Roland Illig 2016

16

それはスタイルの問題ですが、私は好きです:

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

16

前述のように、これはスタイル設定の問題です。Goの作成者が、自分の経験に基づいてスタイルを提案したことを理解していますが、自分のスタイルの一部を私の経験から守っています。

以下はこれをどのようにフォーマットするかです:

err := database.
  QueryRow("select * from users where user_id=?", id).
  Scan(
    &ReadUser.ID,
    &ReadUser.Name,
    &ReadUser.First,
    &ReadUser.Last,
    &ReadUser.Email,
  )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.