Golang中的分行
Golang的代码风格
在go语言中有一个非常神奇的语法检验规则,函数与大括号必须在同一行,if后紧跟的else必须在}的当行,否则不能通过编译。如下:
func main()
{
a := 1
if a != 1 {
}
else {
}
}
报如下错误:
- 缺少函数正文
- '{'异常
又比如在逗号问题上,有特殊的表达方式,若结尾括号与前文最后一元素不在同一行,需添加逗号表明(这一点在C/C++上是不允许的,否则会认为参数匹配异常,当然,如果你使用JavaScript,那就没事了)
func main() {
hmp := map[byte]byte{
')' : '(',
']' : '[',
'}' : '{'
}
fmt.Println(len(hmp))
}
报如下错误:
- 在复合文字中的换行符前面需要尾随逗号
- 应为 ',' 或 new line
探究Golang的编译细节
In effect, newlines following certain tokens are converted into semicolons, so where newlines are placed matters to proper parsing of Go code.
也就是说go编译器会在特定的符号后加入分号;来分行,而C/C++的分行是交给程序员的,也就解释了为什么逗号,会在两种编译情况下产生完全不同的表达。 在go编译器中,上述代码会这样解释:
func main();
{
a := 1;
if a != 1 {
};
else {
};
};
func main() {
hmp := map[byte]byte{
')' : '(',
']' : '[',
'}' : '{';
};
fmt.Println(len(hmp));
};
由于分号问题,不能识别函数,if-else的匹配,函数的传参,所以编译会报错。这里我们再列出go会自动在其结尾添加分号的这些特殊符号:
- 标识符
- 字面量 (数字、字符串、布尔值等)
- 关键字break, continue, fallthrough, return
- 特殊运算++ --
- 特殊分隔符 ) ] }