1. 文章
  2. 文章详情

Go语言规范

Go 是通用型的编程语言,它为系统编程而设计。它是强类型化的语言,具有垃圾回收机制, 并显式支持并发编程。程序由构造,以此来提供高效的依赖管理功能。 既有实现使用传统的“编译-链接”模型,生成可执行的二进制文件。

其语法紧凑而规则,便于 IDE 等自动化工具分析。

记法

语法使用扩展巴克斯-诺尔范式(EBNF)定义:

生成式 = 生成式名 "=" [ 表达式 ] "." .
表达式 = 选择项 { "|" 选择项 } .
选择项 = 条目 { 条目 } .
条目   = 生成式名 | 标记 [ "…" 标记 ] | 分组 | 可选项 | 重复项 .
分组   = "(" 表达式 ")" .
可选项 = "[" 表达式 "]" .
重复项 = "{" 表达式 "}" .

生成式由表达式构造,表达式通过术语及以下操作符构造,自上而下优先级递增(低=>高):

|   选择
()  分组
[]  可选(0 或 1 次)
{}  重复(0 到 n 次)

小写生成式名用于标识词法标记。非最终(Non-terminals)词法标记使用驼峰记法(CamelCase)。 位于双引号 "" 或反引号 `` 内的即为词法标记。

形式 a … b 表示把从 a 到 b 的字符集作为选择项。 横向省略号  也在本文档中非正式地表示各种列举或简略的代码片断。 单个字符 (不同于三个字符 ...)并非Go语言本身的标记。

源码的表示

源码为采用 UTF-8 编码的 Unicode 文本, 其文本并未标准化。因此单个带变音符号的码点不同于结合了字母与变音符号的字符结构, 它们应视作两个码点。为简单起见,本文档将使用非正式的术语字符在源文本中指代 Unicode 码点。

每个码点都是不同的,例如,大写与小写的字母就是不同的字符。

实现限制:为兼容其它工具,编译器会阻止字符 NUL(U+0000)出现在源码文本中。

实现限制:为兼容其它工具,若 UTF-8 编码的字节序标记(U+FEFF)为源文本中的第一个 Unicode 码点,那么编译器就会忽略它。

字符

具体的 Unicode 字符类别由以下术语表示:

换行符      = /* 即 Unicode 码点 U+000A */ .
Unicode字符 = /* 除 newline 以外的任意 Unicode 码点 */ .
Unicode字母 = /* 类型为“字母”的 Unicode 码点 */ .
Unicode数字 = /* 类型为“十进制数字”的 Unicode 码点 */ .

Unicode 标准 6.3, 章节 4.5“一般类别”中定义了字符集类别。其中类别 Lu,Ll,Lt,Lm 及 Lo 被视为 Unicode 字母,类别 Nd 被视为 Unicode 数字。

字母和数字

下划线字符 _(U+005F)被视为一个字母。

字母         = Unicode字母 | "_" .
十进制数字   = "0" … "9" .
八进制数字   = "0" … "7" .
十六进制数字 = "0" … "9" | "A" … "F" | "a" … "f" .

字符串连接

Go 语言的字符串可以通过 + 实现:

package main

import "fmt"

func main() {

    fmt.Println("Google" + "hello")

}

以上实例输出结果为:

Googlehello

词法元素

注释

注释不会被编译,每一个包应该有相关注释。注释有两种形式:

  1. 行注释以 // 开始,至行尾结束。一条行注释视为一个换行符。
  2. 块注释 以 /* 开始,至 */ 结束。 块注释在包含多行时视为一个换行符,否则视为一个空格。

注释不可嵌套。

标记

标记构成 Go 语言的词汇。它有四种类型:标识符关键字, 运算符与分隔符以及字面空白符包括空格(U+0020), 横向制表符(U+0009),回车符(U+000D)和换行符(U+000A),除非用它们来分隔会结合成单个的标记, 否则将被忽略。此外,换行符或EOF(文件结束符)会触发分号的插入。 当把输入分解为标记时,可形成有效标记的最长字符序列将作为下一个标记。

标识符

标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母(A~Z和a~z)数字(0~9)、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字。

以下是有效的标识符:

mahesh   kumar   abc   move_name   a_123
myname50   _temp   j   a23b9   retVal

以下是无效的标识符:

  • 1ab(以数字开头)
  • case(Go 语言的关键字)
  • a+b(运算符是不允许的)

行分隔符

在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。

如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分,但在实际开发中我们并不鼓励这种做法。

以下为两个语句:

fmt.Println("Hello, World!")

fmt.Println("hello")

关键字

下面列举了 Go 代码中会使用到的 25 个关键字或保留字:

breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimportreturnvar

除了以上介绍的这些关键字,Go 语言还有 36 个预定义标识符:

appendboolbytecapclosecomplexcomplex64complex128uint16
copyfalsefloat32float64imagintint8int16uint32
int32int64iotalenmakenewnilpanicuint64
printprintlnrealrecoverstringtrueuintuint8uintptr

程序一般由关键字、常量、变量、运算符、类型和函数组成。

程序中可能会使用到这些分隔符:括号 (),中括号 [] 和大括号 {}。

程序中可能会使用到这些标点符号:.、,、;、: 和 …。

Go语言的空格

Go 语言中变量的声明必须使用空格隔开,如:

var age int;

语句中适当使用空格能让程序更易阅读。

无空格:

fruit=apples+oranges;

在变量与运算符间加入空格,程序看起来更加美观,如:

fruit = apples + oranges; 

发表评论

登录后才能评论

评论列表(0条)