【Go】重难点知识汇总
tips
- 统计代码行数的工具:cloc(Count Lines of Code) 安装教程
- 待续…
《Go语言设计与实现》
编译原理
- 理解编译器的词法与语法解析、类型检查、中间代码生成以及机器码生成过程
- 想要了解Go语言的实现原理,理解它的编译过程就是一个没有办法绕开的事情
- link
1. 将go语言源代码编译成汇编语言
go build -gcflags -S main.go
2. 编译过程涉及的术语和专业知识
- 抽象语法树
- 静态单赋值
- 指令集
3. 编译原理
- 词法与语法分析
- 类型检查
- 中间代码生成
- 机器码生成
运行时
理解运行时中的调度器、网络轮询器、内存分配器、垃圾收集器的实现原理
基础知识
理解数组、切片、哈希表和字符串等数据结构的内部表示以及常见操作的原理
理解make、new、defer、select、for和range等关键字的实现
理解Go语言中的函数、方法以及反射等语言特性
1. 数组
- 数组的访问和赋值需要同时依赖编译器和运行时
- 它的大多数操作在编译期间都会转换成直接读写内存
- 在中间代码生成期间,编译器还会插入运行时方法runtime.panicIndex调用防止发生越界错误
2. 切片
- 切片,即动态数组,其长度不固定,可以向切片中追加元素,它会在容量不足时自动扩容
- 整块拷贝内存仍然会占用非常多的资源,在大切片上执行拷贝操作时一定要注意对性能的影响
3. 哈希表
- 实现哈希表的关键点在于哈希函数的选择,哈希函数的选择在很大程度上能够决定哈希表的读写性能
- Go语言使用拉链法来解决哈希碰撞的问题实现了哈希表
- 它的访问、写入和删除等操作都在编译期间转换成了运行时的函数或者方法
4. 字符串
- 切片在go语言的运行时表示与字符串高度相似,所以常说字符串是一个只读的切片类型
- 字符串上的写入操作都是通过拷贝实现的
5. 函数
- go通过栈传递函数的参数和返回值
- 通过堆栈传递参数,入栈的顺序是从右到左,而参数的计算是从左到右
- 函数返回值通过堆栈传递并由调用者预先分配内存空间
- 调用函数时都是传值,接收方会对入参进行复制再计算
6. 接口
- 接口的类型转换
- 类型断言以及动态派发机制
- 函数调用时发生的隐式类型转换
7. 反射
- 使用反射来动态修改变量
- 判断类型是否实现了某些接口以及动态调用方法等功能
进阶知识
理解常见并发原语Mutex、WaitGroup以及扩展原语的使用和原理
理解HTTP、RPC、JSON等标准库的设计与原理
参考
- https://draven.co/golang/