1.go常用命令

go fmt go语言格式化
go run … 编译后直接运行Go语言程序,编译过程中会产生一个临时文件,但不会生成可执行文件
go build 可以将Go语言程序代码编译成二进制的可执行文件,但是需要我们手动运行该二进制文件
go mod vendor 自动导入某个包
go get … 手动导入某个包
go version go语言版本

2.go基础知识

1.go使用静态链接库编译 生成可执行文件

2.int,int32和int64的区别
int32既可以表示int32也可以表示int64,根据操作系统位数决定
int32表示4字节,int64表示8字节
uint表示无符号

3.字符串的拼接
(1)暴力拼接 少量相加
(2)fmt.Sprintf() 不好
(3)bytes.Buffer{}.WriteString() 还行
(4)[]byte用append 需要提前写好
(5)strings.join() 次好
(6)strings.bulider{}.WriteString() 很好

4.
make 的作用是初始化内置的数据结构,也就是我们在前面提到的切片、哈希表和 Channel,会返回一个有初始赋值的对象。channel在make之后是赋予了内存地址,比较特殊
new 的作用是根据传入的类型分配一片内存空间并返回指向这片内存空间的指针

5.预防程序panic的兜底
image.png

6.for的四种用法
(1)for 无限循环,自己在循环体内设置退出条件
(2)for CONDTION 类似于java的while循环,但是go没有while关键字
(3)for INDEX,VALUE := range XXX 类似于java的增强循环,但同时可以取出index
(4)for INIT,CONDITION,INCREMENT 普通循环

3.go数据类型

1.数组和切片

1.数组是不可变长的,而切片是可变长的,定义方法 var s []int 或者 s := make([]int,0),切片的底层映射是数组

2.从切片中取新的切片时,新切片的长度=新切片末尾索引-新切片第一个索引,容量=原切片底层长度-新切片第一个索引,len(s2) = 5-3,cap(s2) = 7-3
image.png
3.切片的扩容
申请一块更大的内存并将数据进行拷贝,容量小于1024扩容系数为2,大于1024扩容系数为1.25

2.映射

1.map的初始化要用make或者直接写入内容,不能用var。因为用value的默认是nil,而不是基本数据类型的默认值,不用make会产生空指针错误
image.png

image.png
2.map的crud
遍历
map遍历通常使用range操作,且每次遍历顺序不一样
image.png
删除
image.png
查询
image.png
3.map的value支持多种类型interface{},但key是受限制的,因为要进行hash操作,例如slice,func,map等都不能作为key值

4.map底层
image.png
exta表示拉链法的链条
image.png
[]bmap初始有八个
image.png
bmap中的key和value是分开存放的,可以节省为了内存对齐浪费的空间

5.key定位过程
先将key进行hash计算后,低2^B位作为bmap编号,选中bmap,高8位作为topHash的结果来定位value

6.map的rehash
map可以在使用时进行rehash并且无感知,称为渐进式rehash,发生在update/delete的过程中
装填因子(装填因子=数组总数/哈希表长)大于6.5或者overflow过多时进行rehash


参考内容

面向信仰编程 https://draveness.me/
go语言学习网 http://c.biancheng.net/golang/intro/