每天进步一点点!
(一) slice切片(一定看底层结构体实现)
切片是相同类型原始的集合,长度可变。切片是对数组的封装,切片底层包含三个元素,一个是指向数组的指针,一个是切片长度,还有一个是切片容量。切片之间不可以相互比较,只能和nil比较,因为是指向数组指针,即使两个切片元素相同,数组指针也不一定相同,所以无法比较。
源码路径:C:\Program Files\Go\src\runtime\slice.go
type slice struct {
array unsafe.Pointer
len int
cap int
}
(二) GMP模型(未完待续)
G是协程,M是线程,P是调度器;
线程要执行任务,需要获取到P,P来给它分配要执行的G。P有本地队列,协程创建优先放到本地队列,本地队列满了在放入全局队列。
go协程跟其他协程区别在于,其他协程是等协程主动释放cpu,下一个协程才获取到cpu;go不同,go的协程是抢占式的,一个协程最多执行10ms,执行不完就会抢占下cpu,回到队列等下一轮执行,其他协程会抢占cpu。
呜呜,我发现看懂和能说出来,说清楚是两回事,你觉得自己懂了,说的时候却没有条理,明天继续整理。