来自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 .
所以我想知道这样做的方法是什么?
答案 0 :(得分:83)
首先是一些背景。 Go的形式语法在许多作品中使用分号";"
作为终结符,但Go程序可能会省略其中的大多数(并且它们应该具有更清晰,易读的源; gofmt
也会删除不必要的分号)。
规范列出了确切的规则。 Spec: Semicolons:
正式语法使用分号";"作为许多作品的终结者。 Go程序可以使用以下两个规则省略大多数这些分号:
当输入被分解为令牌时,如果该令牌是
,则在行的最后一个令牌之后立即自动将分号插入到令牌流中
- identifier
- integer,floating-point,imaginary,rune或string字面
- 其中一个keywords
break
,continue
,fallthrough
或return
- 其中一个operators and delimiters ++, - ,),]或}
- 醇>
为了允许复杂的语句占用一行,在结束之前可以省略分号")"或"}"。
因此,您可以看到在括号)
后面插入换行符,将自动插入分号;
,因此下一行不会被视为上一行的延续。这就是你的情况,因此以.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);
});
)留在第一行。
.
行继续,如果你在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,
)