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

时间:2016-01-18 03:29:35

标签: go

来自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);

但是我再次得到:

syntax error: unexpected .

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

4 个答案:

答案 0 :(得分:83)

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

规范列出了确切的规则。 Spec: Semicolons:

  

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

     
      
  1. 当输入被分解为令牌时,如果该令牌是

    ,则在行的最后一个令牌之后立即自动将分号插入到令牌流中      
  2.   
  3. 为了允许复杂的语句占用一行,在结束之前可以省略分号")"或"}"。

  4.   

因此,您可以看到在括号)后面插入换行符,将自动插入分号;,因此下一行不会被视为上一行的延续。这就是你的情况,因此以.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
)

答案 1 :(得分:12)

最简单的方法是将操作员(image.addEventListener('load', function(){ console.log(image.width); console.log(image.height); }); )留在第一行。

在许多python样式指南中也不鼓励

.行继续,如果你在go和python之间来回移动,你可以将整个表达式包装在parens中,因为这种技术适用于两种语言。

答案 2 :(得分:11)

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

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

答案 3 :(得分:9)

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

以下是我格式化的方法:

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