Go语言语法要素与代码规范
1 Go语言语法要素与代码规范
Go 语言的语法有两个主要特点:简约与严谨。Go 语言是一门比较讲究代码书写规范的语言,在代码格式和内容上都有一定的要求,有些地方甚至达到了严苛的程度。这是因为 Go 语言的设计者希望能够通过规范代码的编写,减少出现错误的可能性,并使代码更加高效。
举例来说,类似下面一段代码中花括号的用法,这个在 C、C++ 等常见的语言中是完全没有问题的,但是在 Go 语言中会出现编译错误:
for i :=1; i < 10; i++ { fmt.Println(i) }
这是因为,Go 语言要求括起循环体代码的一对花括号的前一个必须跟在 for 语句同一行的条件表达式之后。因此,Go 语言中这段代码的正确格式,如下:
for i :=1; i < 10; i++ { fmt.Println(i) }
1.1 文件和字符串编码
Go 语言代码文件应该要是 UTF-8 编码的纯文本格式的文件。
1.2 语句、代码块与执行顺序
Go 语言代码与其他语言代码类型,都由一条一条的语句(statement)组成。代码执行的顺序一般是从上往下,出现循环或条件分支的情况则按其要求的顺序执行。我们可以将几条语句用花括号括起来成为一个代码块,这些语句被全部执行完毕才会继续往下执行。代码块也经常被称为嵌套代码,嵌套代码内部也是按照从上往下的顺序执行的。
嵌套代码常用于在循环体中表示循环体以及条件判断分支中表示分支、例如下面的代码是 Go 语言中 for 循环的基本写法:
for i :=1; i < 10; i++ { a := i+1 fmt.Println(a) }
花括号中的两条语句合起来成为一个嵌套代码(代码块),在循环语句中这个嵌套代码可以称为 “循环体”,会被循环执行 10 遍。每一遍都会按上下顺序先执行 a:=i+1,再执行 fmt.Println(a) 这一句。
1.3 语句分隔
Go 语言代码中,语句后一般不需要带有表示分隔的分号 “;”,而直接用换行符来分隔。这点与 C、C++、Java 等语言都有所不同,也算是一个优势所在。但是在少数情况下还是不可避免需要用到分号,例如在 for 循环语句中:
package main import "fmt" func main() { for i := 1; i < 10; i++ { fmt.Println(i) } }
上面的 for 循环代码段中,for 后面的三项语句或表达式之间,仍然需要分号分隔。
1.4 语法记号
Go 语言中,每条语句是由:
-
- 语法记号(token)
或
-
- 语法实体(entity)
组成的。语法记号之间至少由一个空白字符分隔开来,空白字符包括空格、tab分隔符等。
语法记号主要包括 4 类:
- 标识符(identifier)
- 关键字(keyword)
- 操作符或标点符号(operator or punctuation)
- 数值量(literal)
1、标识符与预定义标识符
标识符包括类型名、变量名和函数名等,标识符一般由字母和数字组成并且必须由一个字母开始;所有标识符(包括类型名、变量名、函数名等)均区分大小写。
大小写不同的标识符代表不同的实体。例如,变量Abc 与 变量abc 或 aBc 在 Go 语言中会被认为是不同的变量。
在 Go 语言中,还有一些标识符已经预定义(predefined),我们可以直接使用,例如定义变量类型时用到的 int、float64、string、bool 都属于预定义标识符;布尔类型的两个取值 true 和false 也是预定义标识符;make 等内置函数的名字也属于预定义标识符。注意,不要再次定义这些预定义的标识符,即不要用这些标识符作为变量、函数等的名字。
2、关键字
Go 语言中的关键字(保留字)同其他大多数计算机语言一样,都被保留下来作为 Go 语言中表达特殊语法含义之用,不能被用作其他用途,在代码中定义类型名、变量名、函数名等标识符的时候要避免使用这些关键字。Go 语言中的关键字相对比较少,如下所示:
break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var
3、操作符和标点符号
操作符和标点符号是 Go 语言中用于组成表达式或者辅助表示一些语法含义的字符。
加减乘除等运算符都属于操作符,条件判断用到的大于号、小于号等也属于操作符;而用于包含嵌套代码块的花括号、用于表达式中表示优先运算关系的圆括号则属于标点符号。Go 语言中主要用到的操作符和标点符号如下所示。
+ & += &= && == != ( ) - | -= |= || < <= [ ] * ^ *= ^= >= { } / << /= <<= ++ = := , ; % >> %= >>= -- ! ... . : &^ &^=
4、数值量
数值量是在 Go 语言中对各种数值的表达形式,这里的数值除了指数字外,也包括字符串值和布尔类型的值等。
例如,在 Go 语言中表达一个数值可以用下面的方式书写:
123 #代表一个整数
0xFFACDE #0x开头的十六进制数字用于表达一个整数
32.8 #代表一个浮点数(小数)
6.68e-11 #达标一个用科学记数法表示的浮点数
88.3528e-11i #.表示一个数学上的复数、前面是实部,后面是虚部
"Hello world!" #字符串的表达形式
`Hello world!` #反引号`也可以用来扩起字符串
5、标识符的可见性
Go 语言中,以小写字母开始的所有标识符均只能在代码所在的包中使用,如果要提供给外部其他包(包括主程序所在的 main 包)使用,则应该以大写字母开头,这些标识符称作 “被导出的”(exported)标识符。