1、标识符
编程语言的标识符用来标识变量、类型、常量等语法对象的符号名称,其在语法分析时作为一个toke存在。编程语言的标识符总体上分为两类:一类是语言设计者预留的标识符,一类是编程者可以自定义的标识符。前者一般由语言设计者确定,包括语言的预声明标识符及用于后续语言扩展的保留字;后者是用户在编程过程中自行定义的变量名、常量名、函数名等一切符合语言规范的标识符。有一点需要注意,用户自定义的标识符不应该使用语言设计者的预留标识符,这可能导致歧义,并严重影响代码的可读性。
Go的标识符构成规则是:开头一个字符必须是字母或下画线,后面跟任意多个字符、数字或下画线,并且区分大小写,Unicode字符也可以作为标识符的构成,但是一般不推荐这么使用。
9aa //错
-aa //错
aa //对
_aa //对
aa911 //对
_aa911 //对
1.1 关键字
Go语言是一门极简的语言,只有如下25个关键字
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
这25个关键字按功能又可以分为三个部分:
- 引导程序整体结构的8个关键字
package //定义包名
import //导入包名
const //常量声明
var //变量声明
func //函数定义
defer //延迟执行
go //并发语法糖
return //函数返回
- 声明复合数据结构的4个关键字
struct //定义结构类型
interface //定义接口类型
map //声明或创建map类型
chan //声明或创建通道类型
- 控制程序结构的13个关键字
if else //if else语句 for range break continue //for循环使用
switch select type case default fallthrough //switch和select语句使用
goto //goto跳转语句
1.2内置数据类型标识符(20个)
丰富的内置类型支持是高级语言的基本特性,基本类型也是构造用户自定义类型的基础。为了标识每种内置数据类型,Go定义了一套预声明标识符,这些标识符用在变量或常量声明时。Go语言内置了20个预声明数据类型标识符。
数值(16个)
整型(12个)
byte int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintprt
浮点型(2个)
float32 float64
复数型(2个)
complex64 complex128
字符和字符串型(2个)
string rune
接口型(1个)
error
布尔型(1个)
bool
1.3 内置函数(15个)
make
new
len
cap
append
copy
delete
panic
recover
close
complex
real
image
Print
Printin
1.4 常量标识符(4个)
true false //bool类型的两个常量值
iota //用在连续的美剧类型的声明中
nil //指针/引用的变量的默认值就是nil
1.5 空白标识符(1个)
_
空白标识符有特殊的含义,用来声明一个匿名的变量,该变量在赋值表达式的左端,空白标识符引用通常被用作占位,比如忽略函数多个返回值中的一个和强制编译器做类型检查。
1.6 标识符小结
Go语言共有65个预声明标识符,包括25个关键字(keywords)和40个其他预声明标识符。40个其他预声明标识符包括20个内置数据类型标识符、4个常量值标识符、1个空白标识符、15个内置函数。
2、操作符(operators)和分隔符(delimiters)
操作符就是语言所使用的符号集合,包括运算符、显式的分隔符,以及其他语法辅助符号。操作符不但自身是一个token,具备语法含义,同时其自身也是分隔其他token的分隔符。另外还有一类分隔符本身没有什么含义,仅仅起到分隔tokn的功能,这里纯粹的分隔符有4个:空格、制表符、回车和换行。
Go语言一共使用了47个操作符:
+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :
&^ &^=
- 算术运算符(5个)
+ - * / %
- 位运算符(6个)
& | ^ &^ >> <<
- 赋值和赋值复核运算符(13个)
:= = += -= *= /= %= &= |= ^= &^= >>= <<=
- 比较运算符(6个)
> >= < <= == !=
- 括号(6个)
( ) [ ] { }
- 逻辑运算符(3个)
&& || !
- 自增自减操作符(2个)
++ --
#注意:go语言里面自增自减操作符是语句而不是表达式
- 其他运算符(6个)
: , ; . ... <-
3、字面常量
编程语言源程序中表示固定值的符号叫作字面常量,简称字面量。一般使用裸字符序列来表示不同类型的值。字面量可以被编程语言编译器直接转换为某个类型的值。Go的字面量可以出现在两个地方:一是用于常量和变量的初始化,二是用在表达式里或作为函数调用实参。变量初始化语句中如果没有显式地指定变量类型,则Go编译器会结合字面量的值自动进行类型推断。Go中的字面量只能表达基本类型的值,Go不支持用户定义的字面量。
字面量有如下几类。
- 整型字面量(Integer literals)
整型字面量使用特定字符序列来表示具体的整型数值(具体的字符序列构成规则见官方的Go语言规范),常用于整型变量或常量的初始化。示例如下:
42
0600
0xBadFace
23874938275023850238502385023850238
- 浮点型字面量(Floating-point literals)
浮点型字面量使用特定字符序列来表示一个浮点数值它支持两种格式:一种是标准的数学记录法,比如01;另一种是科学计数法的表示,比如1E6。示例如下:
0.
72.40
072.40 // == 72.40
2.71828
1.e+0
6.67428e-11
1E6
.25
.12345E+5
- 复数类型字面量(Imaginary literals)
复数类型字面量使用特定的字符序列来标识复数类型的常量值。示例如下:
oi
011i // == 11i
0.i
2.71828i
1.e+0i
6.67428e-11i
1E6i
.25i
.12345E+5i
- 字符型字面量(Rune literals)
Go的源码采用的是UTF-8的编码方式,UTF-8的字符占用的字节数可以有1~4个字节,Rune字符常量也有多种表现形式,但是使用【‘’】(单引号)将其括住。示例如下:
'a'
'α'
'本'
'\t'
'\000'
'\007'
'\377'
'\x07'
'\xff'
'\u12e4'
'\U00101234'
- 字符串字面量(String literals)
字符串字面量的基本表现形式就是使用【“”】将字符虚列包括在内,双引号里面可以是UTF-8的字符字面量,也可以是其编码值。
"\n"
"\"" // same as `"`
"Hello World!\n"
"中国人"