如何在Golang中打破一长串代码?

Kar*_*lom 79 syntax go

来自Python,我不习惯看到超过80列的代码行.所以当我遇到这个时:

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

我试图打破它

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

但我明白了

 syntax error: unexpected \
Run Code Online (Sandbox Code Playgroud)

我也试过打破输入并在结尾处添加分号:

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

但我再次得到:

syntax error: unexpected .
Run Code Online (Sandbox Code Playgroud)

所以我想知道这样做的golangic方式是什么?

icz*_*cza 94

首先是一些背景.Go的形式语法";"在许多作品中使用分号作为终结符,但Go程序可能会省略其中的大多数(并且它们应该具有更清晰,易读的源; gofmt还可以删除不必要的分号).

规范列出了确切的规则.规格:分号:

形式语法使用分号";" 作为许多作品的终结者.Go程序可以使用以下两个规则省略大多数这些分号:

  1. 当输入被分解为令牌时,如果该令牌是,则在行的最终令牌之后立即自动将分号插入到令牌流中

  2. 为了允许复杂语句占用一行,在结束")"或"}"之前可以省略分号.

因此,您可以看到在括号后插入换行符),;将自动插入分号,因此下一行不会被视为上一行的延续.这是你的情况下发生的事情,因此下一行开头.Scan(&ReadUser.ID,...将给你一个编译时错误,因为它自己(没有前一行)是一个编译时错误:syntax error: unexpected .

所以你可能会在任何与1.上面列出的规则不冲突的地方打破你的界限.

通常,您可以逗号后打破你的线,,之后打开括号例如(,[,{,和点之后.可以参考一些值的字段或方法.您也可以在二元运算符(需要2个操作数的运算符)之后断行,例如:

i := 1 +
        2
fmt.Println(i) // Prints 3
Run Code Online (Sandbox Code Playgroud)

这里值得注意的一件事是,如果你有一个结构或切片或地图文字列出初始值,并且你想在列出最后一个值后断行,你必须输入一个强制逗号,,即使这是最后一个值而不是更多将遵循,例如:

s := []int {
    1, 2, 3,
    4, 5, 6,  // Note it ends with a comma
}
Run Code Online (Sandbox Code Playgroud)

这是为了符合分号规则,以便您可以重新排列和添加新行,而无需添加/删除最后一个逗号; 例如,您只需交换2行而无需删除并添加新逗号:

s := []int {
    4, 5, 6,
    1, 2, 3,
}
Run Code Online (Sandbox Code Playgroud)

列出函数调用的参数时也是如此:

fmt.Println("first",
    "second",
    "third",       // Note it ends with a comma
)
Run Code Online (Sandbox Code Playgroud)

  • TL; DR:**通常你可以在逗号之后打破你的行,在打开括号之后例如(,[,{,并且在点之后.这可能是引用某个值的字段或方法.** (17认同)
  • @ChristopheRoussy这是主观的,我爱的所有行都必须以逗号结尾,我可以轻松地重新排列和添加新行,而无需添加/删除逗号. (4认同)
  • 非常完整和翔实的答案.谢谢! (3认同)
  • 我一直在javascript文字的末尾添加一个逗号.#hatejs (2认同)
  • 最后必须添加一个额外的逗号使我想起一些旧的IE js错误,这很糟糕 (2认同)

tob*_*ies 15

最简单的方法是简单地将operator(.)留在第一行.

\ 在许多python样式指南中也不鼓励使用行继续,如果你在go和python之间来回移动,你可以将整个表达式包装在parens中,因为这种技术适用于两种语言.


pet*_*rSO 13

这是一个风格问题,但我喜欢:

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


hal*_*ium 12

如上所述,这是风格偏好的问题.据我所知,Go的创作者根据我的经验建议了一种风格,但也从我的经验中保留了一些自己的风格.

以下是我将如何格式化:

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