1.token
token是构成源程序的基本不可在分割单元。编译器编译源程序的第一步就是将源程序分割为一个个独立的token,这个过程就是词法分析。Go语言的token可以分为关键字、标识符、操作符、分隔符和字面常量等,如图所示:
Go token分隔符有两类:一类是操作符,还有一类自身没有特殊含义,仅用来分隔其他token,被称为纯分隔符。
操作符:操作符就是 个天然的分隔符,同时其自身也是一个 token, 语句如下所示 sum:=a+b
“:=”和“+”既是分隔符,也是token,所以这个语句被分割为5个token:“sum”、“:+”、“a”、“+”、“b”。
纯分隔符:其本身不具备任何语法含义,只作为其他token的分割功能。包括空格、制表符、换行符和回车符,多个相邻的空格或者制表符会被编辑器看作分隔符处理,比如package main
2.标识符
标识符是用来标识变量、类型、常量等语法对象的符号名称,其在语法分析时作为一个token存在。编程语言的标识符总体上分为两类:一类是语言设计者预留的标识符,一类是编程者可以自定义的标识符。
Go的标识符构成规则:开头一个字符必须是字母或者下划线,后面跟任意多个字符、数字或者下划线,并且区分大小写,Unicode字符可以作为标识符的构成,但是一般不推荐。我们在定义新的标识符时要避开Go语言预声明标识符,以免引起混乱。例如:_a11,a97,aa66,_aa99都可以,9aa,-9hh就不合规了。
2.1 Go语言的预声明标识符有以下25个关键字:
2.1.1 引导程序整体结构的8个关键字
package | 定义包名的关键字 |
import | 导入包名关键字 |
const | 常量声明关键字 |
var | 变量声明关键字 |
func | 函数定义关键字 |
defer | 延迟执行关键字 |
go | 并发语法糖关键字 |
return | 函数返回关键字 |
2.1.2 声明复合数据模块的4个关键字
struct | 定义结构类型关键字 |
interface | 定义接口类型关键字 |
map | 声明或创建map类型关键字 |
chan | 声明或创建通道类型关键字 |
2.1.3 控制程序结构的13个关键字
if else | if else语句关键字 |
for range break continue | for循环使用的关键字 |
switch select type case default fallthrough | switch和select语句使用的关键字 |
goto | goto跳转语句关键字 |
2.2 内置数据类型标识符20个
数据类型分为整型、字符型、字符串型、接口型和布尔型,其中数值分为整型、浮点型和复数型
整型 | byte int int8 int16 int32 int64 uint unint8 uint16 uint32 uint64 uintprt |
浮点型 | float32 float64 |
复数型 | complex64 complex128 |
字符和字符串型 | string rune |
接口型 | error |
布尔型 | bool |
2.3 内置函数15个
make new len cap append copy delete panic recover close complex real image Print Printin
2.4 常见标识符4个
true flase | true false ool 类型的两常量值:真和假 |
iota | 用在连续的枚举类型的声明中 |
nil | 指针/引用型额变量的默认值为nil |
2.5 空白标识符1个
空白标识符:_
空白标识符有特殊的含义,用来声明一个匿名的变量,该变量在赋值表达式的左端,空白标识符引用通常被用作占位,比如忽略函数多个返回值中的一个和强制编译器做类型检查
3.操作符和分隔符
操作符就是语言所使用的符号集合包括运算符、显式的分隔符,以及其他语法辅助符号。操作符不但自身是一个token ,具备语法含义,同时其自身也是分隔其他token的分隔符.
3.1 算术运算符5个
+ - * / % 加减乘除余
算术计算顺序是按照优先级从左到右进行的 当然也可以使用括号来改变操作数的结合顺序。
3.2 位运算符6个
& | ^ &^ >> <<
位运算符用于整数的位运算操作
3.3 赋值和赋值复核运算符13个
:= = += -= *= /= %= &= |= ^= &^= >>= <<=
3.4 比较运算符6个
> >= < <= == !=
3.5 括号6个
( ) { } [ ]
3.6 逻辑运算符3个
&& || !
3.7 自增自减操作符2个
++ --
3.8 其他运算符6个
: , ; . ... <-
4.变量和常量
Go通过一个标识符来绑定一块特定的内存,后续对特定的内存额操作都可以使用该标识符来代替,这类绑定某个存储单元的标识符又可以分为两类:变量和常量,变量表示指定的内存是可以被修改的,常量表示指定的内存不能被修改。
4.1 变量
变量:使用一个名称来绑定一块内存地址,该内存地址中存放的数据类型由定义变量时指定的类型决定,该内存地址里面存放的内容是可变的。
4.1.1 显示额完整声明
var varName dataType [ = value]
关键字var用于变量声明。
varName 是变量名标识符。
dataType 基本类型。
value 是变量的初始值,初始值可以是字面量,也可以是其他变量名,还可以是一个表达式;如果不指定初值, Go 默认将该变量初始化为类型的零值。
Go 变量声明后就会立即为其分配空间
var a int = l
var a int = 2*3
var a int =b
4.1.2 短类型声明
varName := value
:= 声明只能出现在函数内,包括方法内
此时go编译器会根据数据类型自动判断
go支持多个类型变量同时声明赋值,如a , b := 1,”hello"
4.2 常量
常量使用一个名称来绑定一块内存地址,该内存地址中存放的数据类型由定义常量时指定的类型决定,而且该内存地址里面存放的内容不可以改变 Go 中常量分为布尔型、字符串型和 数值型常量
//类似枚举的 iota
const (
c0 = iota I I cO == 0
cl = iota I I cl == 1
c2 = iota I I c2 == 2
)
//简写模式
const (
c0 = iota //cO == 0
c1 //c1 == 1
c2 //c2 == 2
)