关键字
标识符
基本类型 和 它们的字面量
常量 变量
操作符
函数声明与函数调用
代码包和包引入
表达式,语句和简单语句
基本流程控制语法
用来声明各种代码元素
const func import package type var
用于组合类型的字面表示
chan interface map struct
基本流程控制
break case continue default else fallthrough for goto if range switch return select
特殊流程关键字
defer go
一个标识符是以unioncode字母或者 _ 开头并且完全由unioncode字母和uninocode数字组成的单词
Unicode字母是定义在Unicode标准8.0 ? 中的Lu、Ll、Lt、Lm和Lo分类中的字符。
Unicode数字是定义在Unicode标准8.0中的Nd数字字符分类中的字符。
所有的类型名, 变量名 常量名 跳转标签 包名 和包的引入名 都必须是标识符
由UnionCode大写字母开头的标识符成为导出标识符
1种布尔类型 bool
11种中内置整数类型
int8 uint8 int16 uint16 int32 uint32 int64 uint64 int uint uintptr
2种浮点数类型
float32 float64
2种内置的复数类型
complex64 complex128
1种字符串
string
除了bool和string类型 其他15中内置基本类型都称为数值类型
Go中有两种内置类型别名(type alias)
byte是uint8的内置别名 我们可以将byte 和 uint8 看作同一个类型
rune是uint32内置别名 我们可以将rune 和 uint32 看作容一个类型
其中 uintptr int uint 类型的值的尺寸都依赖于具体的编译器实现 通常在64位架构上 int,uint类型的
值是64位,在32位是则是32位
编译器必输保证uintptr类型的值的尺寸能够存下任意一个内存地址
complex64复数值的实部和虚部都是float32
complex128复数值的实部和虚部都是float64
在内存中 浮点数都是用IEEE-754格式存储
尽管布尔和字符串类型分类各自只有一种类型,我们可以声明更多的自定义布尔和字符串类型
1| // 一些类型定义声明
2| type status bool // status和bool是两个不同的类型
3| type MyString string // MyString和string是两个不同的类型
4| type Id uint64 // Id和uint64是两个不同的类型
5| type real float32 // real和float32是两个不同的类型
6|
7| // 一些类型别名声明
8| type boolean = bool // boolean和bool表示同一个类型
9| type Text = string // Text和string表示同一个类型
10| type U8 = uint8 // U8、uint8和 byte表示同一个类型
11| type char = rune // char、rune和int32表示同一个类型
每种类型都有一个零值, 零值都可以看做此类型的默认值, 相应类型的零值如下
bool: false
数值类型: 0 (虽然都是零 但是内存占用不同)
字符串: ""
一个值的字面形式称为一个字面量,它表示此值在代码中的字体体现形式(和内存中的表现形式相对应)
一个值可能有很多种字面量形式
true false
整数类型值有四种字面量形式:
十进制形式(decimal) 不能以 0 开头
八进制形式(octal) )0o 0O 0 开头
十六进制形式(hex) 0x 0X 开头
二进制形式(binary) 0b 0B 开头
一个浮点数的完整字面量形式包含一个十进制整数部分, 一个小数点 一个十进制小数部分和一个整数指数部分,部分可以省略
xEn 表示x乘以10的n次方 xE-n 表示x除以10的n次方
go也支持另外啊一种浮点数字面量形式 称为 十六进制浮点数文字表示 在一个十六进制浮点数文字表示中
1.和整数的十六进制文字表示一样,浮点数的十六进制文字表示也必须使用0x或0X开头
2.和整数的十六进制表示不同的是,字母p或者P必须出现在浮点数的十六进制表示中,其后跟随一个幂指数(底数为2)
浮点类型的零值标准字面量形式为0.0 当然其他的形式表示也是合法的 比如 0. .0 0e0 和 0x0p0
一个虚部值的字面量形式由一个浮点数字面量或者一个整数字面量和其后跟随一个小写的字母i组成 复数零值的标准字面表示为 0.0+0.0i 。 当然 0i 、 .0i 、 0+0i 等表示也是合法的。
数值字面表示中使用下划线分段来增强可读性
下划线 _ 可以出现在整数、浮点数和虚部数字面量中,以用做分段符以增强可读性。
但是要注意,在一个数值字面表示中,一个下划线 _ 不能出现在此字面表示的首尾,并且其两侧的字符
必须为(相应进制的)数字字符或者进制表示头。
上面已经提到, rune 类型是 int32 类型的别名。 因此,rune类型(泛指)是特殊的整数类型。 一个
rune值可以用上面已经介绍的整数类型的字面量形式表示。 另一方面,很多各种整数类型的值也可以
用本小节介绍的rune字面量形式来表示。
在Go中,一个rune值表示一个Unicode码点。 一般说来,我们可以将一个Unicode码点看作是一个
Unicode字符。 但是,我们也应该知道,有些Unicode字符由多个Unicode码点组成。 每个英文或中文
Unicode字符值含有一个Unicode码点。
一个rune字面量由若干包在一对单引号中的字符组成。 包在单引号中的字符序列表示一个Unicode码点
值。 rune字面量形式有几个变种,其中最常用的一种变种是将一个rune值对应的Unicode字符直接包在
一对单引号中。比如:
'a' // 一个英文字符
'π'
'众' // 一个中文字符
下面这些rune字面量形式的变种和 'a' 是等价的 (字符 a 的Unicode值是97)。
'\141' // 141是97的八进制表示
'\x61' // 61是97的十六进制表示
'\u0061'
'\U00000061'
注意: \ 之后必须跟随三个八进制数字字符(0-7)表示一个byte值, \x 之后必须跟随两个十六进制数
字字符(0-9,a-f和A-F)表示一个byte值, \u 之后必须跟随四个十六进制数字字符表示一个rune值
(此rune值的高四位都为0), \U 之后必须跟随八个十六进制数字字符表示一个rune值。 这些八进制
和十六进制的数字字符序列表示的整数必须是一个合法的Unicode码点值,否则编译将失败。
事实上,在日常编程中,这四种rune字面量形式的变种很少用来表示rune值。 它们多用做字符串的双
引号字面量形式中的转义字符
如果一个rune字面量中被单引号包起来的部分含有两个字符, 并且第一个字符是 \ ,第二个字符不
是 x 、 u 和 U ,那么这两个字符将被转义为一个特殊字符。 目前支持的转义组合为:
\a (rune值:0x07) 铃声字符
\b (rune值:0x08) 退格字符(backspace)
\f (rune值:0x0C) 换页符(form feed)
\n (rune值:0x0A) 换行符(line feed or newline)
\r (rune值:0x0D) 回车符(carriage return)
\t (rune值:0x09) 水平制表符(horizontal tab)
\v (rune值:0x0b) 竖直制表符(vertical tab)
\\ (rune值:0x5c) 一个反斜杠(backslash)
\' (rune值:0x27) 一个单引号(single quote)
rune类型的零值常用 '\000' 、 '\x00' 或 '\u0000' 等来表示。
在Go中,字符串值是UTF-8编码,甚至所有的Go源码都必须是UTF-8编码
Go字符串字面量形式有两种, 一种是解释型字面表示 双引号格式 另外一种是直白字面表示 反引号格式
在上面的解释形式(双引号风格)的字符串字面量中,每个 \n 将被转义为一个换行符,每个 \" 将被转
义为一个双引号字符。 双引号风格的字符串字面量中支持的转义字符和rune字面量基本一致,除了一
个例外:双引号风格的字符串字面量中支持 \" 转义,但不支持 \' 转义;而rune字面量则刚好相反。
以 \ 、 \x 、 \u 和 \U 开头的rune字面量(不包括两个单引号)也可以出现在双引号风格的字符串字面量
中
直白反引号风格的字面表示中是不支持转义字符的。 除了首尾两个反引号,直白反引号风格的字面表
示中不能包含反引号。 为了跨平台兼容性,直白反引号风格的字面表示中的回车符(Unicode码点
为 0x0D ) 将被忽略掉。
字符串类型的零值在代码里用 "" 或 `` 表示。
当一个数值型的字面量用来表示一个整数基本类型的时候,舍入是不允许的 比如1.0可以表示任何基本整数类型的值
但是1.01 却不可以 当一个数值型的字面量用来表示一个非整数的基本类型的值时,舍入是允许的
注意几个溢出的例子:
字面量 0x10000000000000000 需要65个比特才能表示, 所以在运行时刻,任何基本整数类型都
不能精确表示此字面量。
在IEEE-754标准中,最大的可以精确表示的float32类型数值
为 3.40282346638528859811704183484516925440e+38 ,所以 3.5e38 不能表示任何float32
和complex64类型的值。
在IEEE-754标准中,最大的可以精确表示的float64类型数值
为 1.797693134862315708145274237317043567981e+308 ,因此 2e+308 不能表示任何基本数
值类型的值。
尽管 0x10000000000000000 可以用来表示float32类型的值,但是它不能被任何float32类型的值
所精确表示。上面已经提到了,当使用字面量来表示非整数基本数值类型的时候,精度丢失是允
许的(但溢出是不允许的)。