关于错误处理:为什么我不能将开口括号放在下一行?

Why can't I put the opening braces on the next line?

当我试图编译以下代码时遇到一个奇怪的错误:

1
2
3
4
5
6
7
8
9
10
11
12
    package main

    import fmt"fmt"

    func main()
    {
       var arr [3]int
       for i:=0; i<3; i++
       {
         fmt.Printf("%d",arr[i])
       }
    }

错误如下:

1
    unexpected semicolon or newline before {

修正后,以下代码生效:

1
2
3
4
5
6
7
8
9
10
    package main

    import fmt"fmt"

    func main(){
       var arr [3]int
       for i:=0; i<3; i++{
         fmt.Printf("%d",arr[i])
       }
    }

Go语言是严格打出来的吗?这也没有警告。这不应该是一个程序员的选择,他想如何格式化他的代码?go语言警告和错误


Go语言自动插入分号,因此{唯一允许的位置是在前一行的末尾。始终使用与gofmt生成的相同样式编写go代码,这样您就不会遇到任何问题。

参见Go的常见问题解答:为什么有大括号但没有分号?为什么我不能把开口撑放在下一行呢?


go语言包含带有特定规则的分号,在您的例子中,i++后面的新行在""前面引入了分号。请参阅http://golang.org/doc/go_spec.html。

格式化在某种程度上是语言的一部分,使用gofmt使代码看起来类似,但是,您可以用许多不同的方式格式化代码。


Should this not be a programmers choice how he wants to format his
code?

也许吧。我认为向前走一步以避免一些自行车脱落是很好的,比如永不结束的风格讨论。甚至还有一个工具,gofmt,它以标准样式格式化代码,确保大多数go代码遵循相同的准则。就像他们说的:"处处一致>个人偏好。习惯吧,这很好(tm)。"


Go代码具有必需的支撑样式。同样地,程序员不能选择在Python中使用大括号,因此需要使用缩进。

所需的支撑样式允许分号插入工作,而不需要解析器向前看下一行(如果要实现一个repl-for-go代码,这很有用)。

1
2
3
package main

func main();

是有效的go代码,在不查看下一行的情况下,解析器假定这是您的意思,然后会被未连接到您在其后面放置的任何内容的块所混淆。

在所有GO代码中使用相同的支撑样式可以使阅读更容易,并且避免讨论支撑样式。


Go-lang使用严格的规则来维护像python这样的阅读器的唯一可见性,使用可视化代码ide,它将进行自动格式化和错误检测。