基本语法
普通变量声明
指针变量
匿名变量
数据类型
整形
int 有符号整型 uint 无符号整形
进制
浮点型
float32
,也即我们常说的单精度,存储占用4个字节,也即4*8=32位,其中1位用来符号,8位用来指数,剩下的23位表示尾数单精度时指数偏移度为 127(7FH),目的是为了同时可以表示正和负的指数(-128,127),指数部分00000000-11111111 分别对应 -127 -- 128 。
图中指数应该为 2^2+2^3+2^4+2^5+2^6=124 ,再减去单精度偏移度 127:124-127=-3 。
而小数(尾数)部分为0.01,即这个数为: 1.01*10^(-3) =0.00101(二进制)。
换成10进制为,0.00001 = 2^(-5) ,0.001=2^(-3) :0.125+0.03125=0.15625
float64
,也即我们熟悉的双精度,存储占用8个字节,也即8*8=64位,其中1位用来符号,11位用来指数,剩下的52位表示尾数,双精度的偏移量为1023(3FFH)。byte
与 rune
byte
,占用1个节字,就 8 个比特位(2^8 = 256,因此 byte
的表示范围 0->255),所以它和 uint8
类型本质上没有区别,它表示的是 ACSII
表中的一个字符。rune
,占用4个字节,共32位比特位,所以它和 int32
本质上也没有区别。它表示的是一个 Unicode
字符(Unicode
是一个可以表示世界范围内的绝大部分字符的编码规范)byte
和 uint8
没有区别,rune
和 uint32
没有区别,直观上让人以为 uint8
和 uint32
是一个数值,但是实际上,它也可以表示一个字符,为了消除这种直观错觉,就诞生了 byte
和 rune
这两个别名类型。字符串
表示出
\r\n
这个字符串:数组
Go 中,数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。
声明与初始化
除了可以指定数组长度,还可以使用
[...]
,让编译器根据实际情况分配空间。查看数组类型:
[6]int
[4]int
表示这两个数组的类型不相同,快速方便生成相同类型的数组,可以使用 type
关键字(对于其它类型也适用):切片
切片(Slice)与数组一样,都是可以容纳若干类型相同元素的容器,但是无法通过切片类型确定其长度,切片是以数组作为底层数据结构。
切片是对数组的一个连续片段的引用,是数组的子集,终止索引不在切片内,左闭右开。
构造切片
字典
Map 类型,由若干个
key : value
键值映射对组成。是哈希表的一个实现,这就要求它的每个映射里的key,都是唯一的,可以使用 ==
和 !=
来进行判等操作,换句话说就是key必须是可哈希的。在声明字典时,必须指定好你的key和value是什么类型的,然后使用 map 关键字来告诉Go这是一个字典:
删除元素 ,使用 delete 函数,如果 key 不存在,静默处理,不会报错
访问不存在的 key 也不会报错,返回 value 这个类型的初始值,int 类型的初始值为 0 。当key不存在,会返回value-type的零值 ,所以你不能通过返回的结果是否是零值来判断对应的 key 是否存在,因为 key 对应的 value 值可能恰好就是零值。
字典的下标读取可以返回两个值,使用第二个返回值都表示对应的 key 是否存在,若存在ok为true,若不存在,则ok为false
遍历字典的内容
字典取 key
字典取 value
布尔类型
Go 中,真值用 true 表示,不但不与 1 相等,并且更加严格,不同类型无法进行比较,而假值用 false 表示,同样与 0 无法比较。bool 与 int 不能直接转换,需要自己使用函数转换:
bool 转 int
int 转 bool
Go 中使用
!
符号取反,同时使用 &&
表示且
,用 ||
表示或
,并且有短路行为(即左边表达式已经可以确认整个表达式的值,那么右边将不会再被求值。指针类型
类似 C 语言