正确的:
if(true) {
}
不正确:
if(true)
{
}
为什么要强制执行这种风格,它是否与语言规范有关,或者仅仅是因为他们更喜欢一种风格而不是另一种风格?
正确的:
if(true) {
}
不正确:
if(true)
{
}
为什么要强制执行这种风格,它是否与语言规范有关,或者仅仅是因为他们更喜欢一种风格而不是另一种风格?
Why are there braces but no semicolons? And why can't I put the opening brace on the next line?
Go uses brace brackets for statement grouping, a syntax familiar to programmers who have worked with any language in the C family. Semicolons, however, are for parsers, not for people, and we wanted to eliminate them as much as possible. To achieve this goal, Go borrows a trick from BCPL: the semicolons that separate statements are in the formal grammar but are injected automatically, without lookahead, by the lexer at the end of any line that could be the end of a statement. This works very well in practice but has the effect that it forces a brace style. For instance, the opening brace of a function cannot appear on a line by itself.
大多数C派生语言使用 style if ( <condition> ) <statement>
,statement
如果condition
为 true 则执行。statement
可以是单个语句或大括号括起来的块。
Go 的if
语句需要一个大括号括起来的块,而不是单个语句。这是为了避免大多数样式指南试图通过要求所有语句都使用大括号来避免的常见错误。if
//subtle error in C
if (<condition>)
<statement1>;
<statement2>;
现在 Go 需要在if
语句后面加上一个大括号块,这()
是多余的。它们仅用于帮助词法分析器区分条件和语句,否则if <condition> <statement>
很难解析。(条件在哪里结束,语句在哪里开始?)
现在 Go 的作者有一个决定:
()
{
遵循<condition>
他们认为冗余是不可取的。这有第二个副作用。由于;
每个换行符都有一个隐式,如果{
在下一行 a;
被放在 the<condition>
和之间{
。Go 的作者再次面临一个决定:
<condition>; {
构造很聪明if ... {
一致的共同风格。<condition>
在单行上。对解析器进行特殊封装是一件非常糟糕的事情。看看速度D和 Go 解析器与 C++ 糟糕的解析器性能相比。统一的风格也是一件好事。考虑到这些限制,他们的最终决定非常简单。
它与Spec有关,即它不仅仅是他们内置在编译器中的东西
分号
形式语法使用分号“;” 作为许多作品的终结者。Go 程序可以使用以下两条规则省略大部分分号:
当输入被分解为标记时,如果该行的最终标记为
- 标识符
- 整数、浮点数、虚数、符文或字符串文字
- 关键字 break、continue、fallthrough 或 return 之一
- 运算符和分隔符之一 ++、-、)、] 或 }
为了允许复杂的语句占据一行,可以在结束“)”或“}”之前省略分号。
为了反映惯用用法,本文档中的代码示例使用这些规则省略了分号。
据我从他们的谈话中了解到,他们想摆脱格式讨论,并通过 gofmt 的伟大扩展了这个想法
因为 google 的人不喜欢 allman 风格。但是很容易支持 allman 风格,forkGo(by @diyism) 只在 golang 编译器中添加了 12 行代码。
试试 forkGo: https ://github.com/forkgo-org/go
forkGo 支持这样的 allman 风格:
package main
import
(
"fmt"
)
func main()
{
if false
{ fmt.Println("jack")
fmt.Println("forkgo")
} else
{ fmt/
.Println("hello")
fmt.Println("forkgo")
}
}
...“他首先要使用大括号(即,使大括号排列在同一列上的语句块的范围更容易识别),”...
同意-如果您想对齐大括号以区分块,则非常困难