token
token是构成源程序的基本不可再分割的单元。编译器编译源程序的第一步就是将源程序分割为一个个独立的token, 这个过程就是词法分析。Go语言的token可以分为标识符、操作符分隔符、字面常量。
1. 标识符
- 预声明标识符:
- 关键字(25个):
- 引导程序整体结构的8个关键字: package, import, const, var, func, defer, go, return
- 声明复合数据结构的4个关键字: struct, interface, map, chan
- 控制程序结构的13个关键字:
Go的源代码的顺序并不一定是编译后最终可执行程序的指令顺序,
这里面涉及语言的运行时和包的加载过程
- if else 语句关键字:if, else,
- Go语言没有条件运算符
a>b?a:b
,这符合Go的设计哲学,只提供一种方法做事情
- Go语言没有条件运算符
- for循环使用的关键字:for, range, break, continue
- break和continue使用到标签时,标签和它们必须在同一函数内
- switch和select语句使用的关键字:switch, select, type, case, default, fallthrough
- switch和if语句一样,后面也可以带一个可选的初始化语句
- switch后面的表达式也是可选的:
- 没有表达式: case子句是一个布尔表达式,而不是一个值
- 含有表达式: 表达式的值不像C语言那样必须限制为整数,可以是任意支持相等比较运算的类型变量
- fallthrough:强制执行下一个case子句,不再判断下一个case子句的条件是否满足
- 无条件跳转关键字:goto
- goto语句只能在函数内跳转
- goto语句不能跳过内部变量声明语句,这些变量在goto语句的标签语句处又是可见的
- goto语句只能跳到同级作用域或者上层作用域内,不能跳到内部作用域内
- if else 语句关键字:if, else,
- 其他预声明标识符:
- 内置数据类型标识符(20个):
- 数值:
- 整型(12个): byte, int, int8, int16, int32, int64(byte是uint8的同义词) uint,uint8,uint16,uint32,uint64,uintptr
- 浮点型(2个):float32,float64(默认)
- 计算机很难进行浮点数的精确表示和存储,因此两个浮点数之间不应该使用
==
或!=
进行比较操作 - 高精度科学计算应该使用
math
标准库
- 计算机很难进行浮点数的精确表示和存储,因此两个浮点数之间不应该使用
- 复数型(2个):complex64,complex128
- 复数在计算机里面使用两个浮点数表示,一个表示实部,一个表示虚部。
- complex64是由两个float32构成的,complex128是由两个float64构成的
- 字符和字符串型(2个):string rune(rune是int32的别名)
- go默认使用utf-8编码,如果需要特殊的编码转换,需要使用
unicode/utf8
标准包
- go默认使用utf-8编码,如果需要特殊的编码转换,需要使用
- 接口型(1个):error
- 布尔型(1个):bool
- 数值:
- 常量值标识符(4个):iota, true, false, nil
- 空白标识符(1个):_
- 内置函数(15个): complex,real,imag make,new,len,cap,append,copy,delete print,println panic,recover close
- 内置数据类型标识符(20个):
- 关键字(25个):
- 用户自定义标识符: 包名,变量名,常量名,函数名,方法名,自定义类型名。
- 开头一个字符必须是字母或下划线,后面跟任意多个字符、数字或下划线
- 区分大小写
- Unicode字符也可以作为标识符的构成,但是一般不推荐这么使用
- 要避开Go语言预定义标识符,以免引起混乱
2. 操作符分隔符
- 纯分隔符(4个): 空格,制表符,回车和换行
- 操作符(47个):不但起到分隔token的作用,本身也是一个token
- 算术运算符(5): + - * / %
- 位运算符(6): & | ^ &^(clear) » «
- 赋值和复合赋值运算符(13): := = += -= *= /= %= &= |= ^= &^= »= «=
- 比较运算符(6): > >= < <= == !=
- 括号(6): () {} []
- 逻辑运算符(3个): && || !
- 自增自减操作符(2个): ++ –
- 其他操作符(6): : , ; . … <-
3. 字面常量
- 整型字面量: 0开头的是8进制,0x开头是16进制,0b开头是2进制。
- 浮点型字面量 .12345E5 = 0.12345 * (10 ^ 5) .12345e5 = 0.12345 * (e ^ 5) 在golang中,e表示自然系数,E表示10
- 复数类型字面量
- 字符串字面量
- 字符型字面量
4. 作用域
在高级编程语言中,作用域(scope)是指名字(name)与实体(可以理解为特定内存地址)的绑定(binding)保持有效的那部分程序逻辑区间。
Go语言是静态作用域的语言。
- 所谓静态作用域就是变量的作用域不依赖程序执行时的因素,变量作用域在编译期就能确定。
- Go语言有三种类型的作用域:
- 全局作用域
- Go语言内置的预声明标识符,它们具有全局作用域,在任意命名空间内都可见
- Go语言包内以大写字母开头的标识符(包括变量、常量、函数和方法名、自定义类型、结构字段等),它们具有全局作用域
- 包内作用域
- 在Go语言包内定义的以小写字母开头的标识符(变量、常量、函数和方法名、自定义类型、结构字段等),它们在本包可见,在其他包都是不可见的,这些标识符具有包内作用域。
- 隐式作用域
- 每个代码块内定义的变量称为“局部变量”,这些局部变量只在当前代码块内可见,其作用域属于当前代码块的隐式作用域。
- 全局作用域