为什么Golang强制执行大括号不在下一行?

jok*_*oon 27 coding-style curly-braces go

正确:

if(true) {

}
Run Code Online (Sandbox Code Playgroud)

不正确的:

if(true)
{

}
Run Code Online (Sandbox Code Playgroud)

为什么这种风格被强制执行,它是否与语言规范有关,还是因为他们更喜欢一种风格而不是另一种?

Mat*_*all 40

为什么有括号但没有分号?为什么我不能把开口支架放在下一行?

Go使用括号括号进行语句分组,这是一种熟悉C系列中任何语言的程序员所熟悉的语法.但是,分号用于解析器,而不是用于人,我们希望尽可能地消除它们.为了实现这个目标,Go借用了BCPL的一个技巧:分隔语句的分号在形式语法中,但是在任何可能是语句结尾的行末尾的词法分析器自动注入,而不是预测.这在实践中非常有效,但具有强制支撑样式的效果.例如,函数的左大括号本身不能出现在一行上.

http://golang.org/doc/faq#semicolons

  • 如果它强制支撑样式首先破坏了使用支撑的点(即,使得在同一列上排列括号的容易识别语句块的范围),那么很难将其描述为"工作得很好".我个人更喜欢手动添加分号,如果这意味着我可以合理地排列括号.治愈比疾病更糟糕的一个完美的例子. (58认同)
  • 他们的借口是虚假的.Lua一直在使用分号代码块而不需要分号,因为在Go之前甚至已经开始使用分号.他们可以允许支持其他支撑样式,但他们明确选择不支持.无论是为了让他们在解析时作弊还是因为他们决定强迫他们在用户群上使用他们的个人偏好,这两个原因都是将用户锁定为单一支撑样式的不好理由. (11认同)
  • @Neutrino:我怀疑语言设计师认为风格执行是一件好事."限制正在解放." (10认同)
  • @Pharap:更不用说,新行上的大括号是ANSI标准.K&R不是.但标准的美妙之处在于有许多不同的标准.InternetExplorer就是一个很好的例子.此外,强制执行样式以便可以更好地打印代码是愚蠢的.他们应该强制执行一种风格,最大限度地阻止您首先在纸上打印代码.打印代码是愚蠢的(你想要实现什么?备份?),这是一个安全风险,更不用说环境问题了.此外,如果您想要使用特定格式的代码,请编写一个美化器. (3认同)
  • @StefanSteiger嗯.我在纸上打印代码,因为它更容易通过调试,解决复杂的问题,或简单地用红笔来解决问题.你对愚蠢的看法非常苛刻和自以为是.#只是在说. (2认同)
  • 为什么不直接写机器码呢?编程语言的目的是使程序易于人类而非机器阅读。获得可由机器高效执行的代码是编译器的目的。我不在乎解析很慢。这些括号对人眼没有帮助。Python在这里更加连贯。 (2认同)

def*_*ode 25

大多数C下降的语言都使用该样式if ( <condition> ) <statement>,statement如果condition是真的则执行.在statement可以是单个语句或支柱封闭块.

Go的if语句需要一个跟随括号的封闭块,而不是单个语句.这是为了避免大多数样式指南试图通过要求所有语句都使用大括号来避免的常见错误if.

//subtle error in C
if (<condition>)
  <statement1>;
  <statement2>;
Run Code Online (Sandbox Code Playgroud)

现在,Go在if语句后面需要一个大括号块,这()是多余的.它们只用于帮助词法分析器区分条件和语句,否则if <condition> <statement>很难解析.(条件何处结束,语句开始?)

现在Go的作者决定:

  • 保持多余 ()
  • 要求{遵循<condition>

他们认为裁员是不可取的.这有第二个副作用.由于;每个换行都有一个隐含的,如果{是在下一行;,则在<condition>和之间放置一个{.Go的作者再次面临一个决定:

  • 特殊情况下,解析器对<condition>; {构造有所了解
  • 要求每个人都采用if ... {同一条线上的共同风格.
  • 要求<condition>在一条线上.

解析器的特殊外壳是一件非常糟糕的事情.看看速度D和Go解析器与C++糟糕的解析器性能相比.统一的风格也是一件好事.鉴于约束条件,他们的最终决定非常简单.

  • 为什么我们不直接编写机器代码?编程语言的目的是使程序易于人类读取,而不是机器.获取机器执行高效的代码是编译器的目的.我不在乎解析很慢.这些括号无助于人眼.Python在这里更加连贯. (3认同)

Mik*_*ike 23

我认为这种强制性的东西只是让人们喜欢K&R风格的借口,而不必看到Allman的风格.如果设计师喜欢Allman风格,那么他或她就会简单地让解析器处理它.想象一下,如果XML是用K&R编写的.看起来似乎无法理解.Allman风格更容易阅读.这似乎完全是一种情绪化的决定.我也会做一个:忽略Go.

  • 我支持我的发言.我认为程序员被迫必须在行尾放置大括号,这绝对是荒谬的.支架排列的Allman风格更容易理解.使用K&R,您必须向右移动眼睛,然后当它从屏幕滚动时,您必须在视图中滚动支架.当长行被包裹时,这变得尤其令人困惑,其中包裹的线应该是缩进的.然后你不得不怀疑它是否在if中.我不明白为什么人们会坚持K&R的风格. (12认同)
  • 我不明白为什么人们喜欢K&R,并且喜欢它,他们用语言来拒绝任何东西,但很明显,Allman看起来更清洁,更快速地理解.我明白为什么人们会喜欢K&R的唯一原因是它为您节省了一行代码,以便更多代码适合屏幕.这在80年代的杂志印刷代码时代很有用.我承认这只是意见,但如果一个人坚信并且发现一种风格比另一种风格好得多,而且当没有真正的理由我们应该被强迫时,那么我觉得强迫它是冒犯的. (8认同)
  • 这似乎是推测性的(更不用说愚蠢了). (4认同)
  • 问题是*为什么*Go强制执行K&R支撑风格,而不是K&R风格是好还是坏.你声称这是因为设计师"喜欢K&R风格",并希望强迫人们使用它.您没有证明此声明是正确的.[马特·鲍尔的回答(http://stackoverflow.com/a/17153873/827263)给出了一个较为合理的解释*和备份它*.我不是说你不应该被Go的行为所冒犯.我说你没有回答OP的问题. (4认同)
  • 您是否有任何理由认为这是Go强制执行此风格的实际原因?至于K&R与Allman风格的好处,我不打算让你相信K&R风格更好 - 但它很容易在视觉上匹配开头关键字(`if`,`while`,... )关闭`}`.我相信你是对的:你*不明白为什么人们喜欢K&R风格. (2认同)
  • @Keith Thompson缺少对齐花括号来查找代码块的能力不会令您发疯吗? (2认同)
  • Kotlin团队能够容纳Allman,尽管起初它也决定了K&R。那为什么Go男孩也不能呢?是的,对非K&R的偏执就是这样。 (2认同)
  • 代码是由人编写的,由机器编译/解释,但也意味着由人阅读和维护。我曾经写过Allman风格,现在我主要是在写K&R风格,但是我可能会写任何风格,这取决于代码的长度和形状以及使其更易于阅读和维护的原因。强制使用某种语言的特定风格通常会引起情感上的困扰。我完全同意您所说的每句话,迈克! (2认同)

tik*_*ike 6

它与Spec有关,也就是说它不仅仅是他们在编译器中构建的东西

分号

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

当输入被分解为令牌时,如果该行的最终令牌是,则在非空行的末尾自动将分号插入到令牌流中

  • 标识符
  • 整数,浮点,虚数,符文或字符串文字
  • 其中一个关键字是break,continue,fallthrough或return
  • 其中一个运算符和分隔符++, - ,),]或}

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

为了反映惯用语,本文档中的代码示例使用这些规则省略分号.

据我从他们的谈话抓住了,他们想摆脱格式,讨论和扩展了的greation想法gofmt