导图社区 计算机——go语言
go语言的系统总结的思维导图,面试前或使用go前的学习总结
编辑于2020-05-17 20:04:11go
slice
init
make
[]type{}
growing
2
cap
share
共享空间
compare
只能和nil对比
array
init
[nums]type{}
[...]type{}
comapare
length
type
遍历
for range
map
def
map[type]type{}
make
exist key
默认0值
v,ok := m[key]
一等公民
function
map[int]func(op int)int{}
工厂模式
set
map[type]bool
delete
delete(map, key)
string
只读byte slice
unicode & UTF8
rune
strings
strconv
函数
一等公民
函数可以作为参数和返回值
可以有多个返回值
无命名
命名
可以作为变量的值
所有参数都是值传递
可变参数
...type
defer
panic
custom type
struct
interface
function
type
object
封装
struct
init
{}
new
.
method
指针访问
unsafe.pointer
没有数据的复制
实例访问
继承
扩展,包含,复合
匿名类型
命名成员类型
多态
interface
interface
duke type
接口非侵入
所有接口的定义可以包含在一个程序文件中
指针
空接口
表示任何类型
i,k:=p.(int)
最佳实践
倾向于使用小的接口定义,很多接口只包含一个方法
较大的接口定义,可以由多个小接口组合而成
只依赖于必要功能的最小接口
错误机制
没有异常机制
error类型实现了errorj接口
可以通过errors.New来快速创建错误实例
最佳实践
定义预知错误
及早失败,减少嵌套
panic
defer
err := recover ;err != nil {}
package
init
只会执行一次
依赖管理
Groutine
与thread区别
stack 2k
KSE
M:N
go
值传递
http
net/http
resultful
router
httprouter
unsafe
cgo
unsafe.Pointer(&i)
atomic
CSP
与actor区别
actor是直接通讯不同,csp模式则是通过channel进行通讯的,更松耦合一些
go中的channel是有容量限制并且独立于处理groutine,actor模型中mailbox容量是无限的,接收进程也总是被动处理消息
channel
阻塞
缓存的
异步返回
返回一个channel
可以阻塞,也可不阻塞
关闭
使用关闭
data, ok := <- ch
向关闭channel发送数据会报错 panic
所有channel接受者都会在channel关闭时,立即从阻塞等待中返回其上述ok值为false,这个广播机制常常被利用,进行向多个订阅者同时发送信号。
共享内存
lock
sync
Mutex
RWLock
defer lock.unlock
WaitGroup
wg.Add(1)
wg.Done()
多路选择超时机制
select case
channel
time.After()
任务取消
select {case := <- ch}
关联任务
context
并发编程
单例模式
sync.Once
Do
只执行一次
对象池
channel buffer
get
relase
sync.Pool
对象生命周期
GC会清除sync.pool缓存的对象
对象的缓存有效期为下一次GC之前
总结
适合通过复用,降低复杂对象的创建和GC代价
协程安全,会有锁的开销
生命周期受GC影响,不适合做连接池,需要自己管理生命周期的资源的池化
测试
单元测试
testing.T
Error
Fail
表格测试
Benchmark
testing.B
BDD
goconvery
反射
reflect
typeOf
reflect.Type
ValueOf
reflect.Value
Kind
DeepEqual
Elem()
struct Tag
性能
架构模式
pipe-filter
特点
非常适合与数据处理以及数据分析系统
filter封装数据处理的功能
松耦合:filter只跟数据(格式耦合)
pipe用于连接filter传递数据或者在异步处理过程中缓冲数据流进程内同步调用是,pipe演变为数据在方法调用间传递
应用
ETL
爬虫解析
colly
组合模式
micro kernal
特点
易于扩展
错误隔离
保持架构一致性
要点
内核包含了公共流程或通用代码
将可变或扩展部分规划为扩展点
抽象扩展点行为,定义接口
利用插件进行扩展
结构解析
json
esayjson
实现
反射
Tag
性能分析
graphiz
pprof
go tool pprof
net/http/pprof
torch
性能调优
过程
设定优化目标
分析系统瓶颈点
优化瓶颈点
指标
wall time
CPU TIme
Block Time
Memory allocation
GC times/time spent
锁
sync.Map
coroutine_map
减少锁影响范围
减少发送锁的概率
避免锁的使用
LAMX Disruptor
GC友好代码
避免内存分配和复制
复杂对象尽量传递引用
数组传递
结构体传递
初始化至合适的大小
自动扩容有代价的
复用内存
GODEBUG=gctrace=1
go tool trace
高效字符连接
StringBuider
设计
面向恢复设计
健康检查
注意僵尸进程
池化资源耗尽
死锁
let it crash
构建可恢复的系统
拒接单体系统
面向错误和恢复的设计
在依赖服务不可用时,可以继续存活
快速启动
无状态
与客户端协商
ACK
面向错误设计
隔离错误
micro kernel
隔离部署
微服务
重用与隔离
冗余
限流
bucket
慢响应
超时机制
错误传递
断路器
Chaos Engineering