go数据类型-slice底层-牛翰网

go数据类型-slice底层

切片的底层数据结构 有上篇string为基础了,能猜到slice肯定也有一个对应的struct。 在runtime的 slice.go中 type slice struct { array unsafe.Pointer len int cap int } 切片的本质是对数组...
10个月前
0548
go数据类型-map-牛翰网

go数据类型-map

go的map在面试时候经常会被问到。 最近看到群里有个被问到为什么map的每个桶中只装8个元素? map 的结构 注:解决hash冲突还有一些别的方案:开放地址法 (往目标地址后面放)、再哈希法(再次h...
10个月前
03412
go数据类型-sync.map-牛翰网

go数据类型-sync.map

定义 在runtime的sync.map包中有定义: type Map struct { mu Mutex // 锁 read atomic.Pointer[readOnly] //包含了readOnly类型的一个struct,下方把 Pointer 也贴了 dirty map[any]*entry
10个月前
37410
go数据类型-空结构体、空接口、nil-牛翰网

go数据类型-空结构体、空接口、nil

空结构体 func main() { a := struct{}{} fmt.Println(unsafe.Sizeof(a)) fmt.Printf("%p\n", &a) } 打印 0 0x117f4e0 有经验的开发人员都知道,所有的空结构体是指向一个 zeroba
10个月前
03111
go协程、线程的本质,如何协调运作-牛翰网

go协程、线程的本质,如何协调运作

协程与线程 线程在创建、切换、销毁时候,需要消耗CPU的资源。 协程就是将一段程序的运行状态打包, 可以在线程之间调度。减少CPU在操作线程的消耗 协程、线程、进程 这块网上非常多文章讲了,...
10个月前
0397
go-GMP-牛翰网

go-GMP

go的协程和线程都绕不过GMP,关于GMP基本的工作流程,有go开发经验的大致都懂,这边更多关注GMP如何解决一些类似 协程饥渴的问题,以及底层的大致实现原理。 多线程循环 上篇讲了单线程是如何循...
10个月前
04014
go-GMP 协程切换时机 和 协程实战-牛翰网

go-GMP 协程切换时机 和 协程实战

当m在执行某个g的时候,g非常耗时,例如一个for循环,每次循环sleep1分钟,循环1000次。 这个例子看似无聊,却是很难解决的,成功的避开了2个系统切换时机。 如果这个时候,一直执行这个g,别的...
10个月前
1245
go锁基础 - atomic、sema-牛翰网

go锁基础 – atomic、sema

atomic和sema是实现go中锁的基础,简单看下他们的实现原理。 atomic atomic 常用来作为保证原子性的操作。 当多个协程,同时一个数据进行操作时候,如果不加锁,最终的很难得到想要的结果。 var...
10个月前
04214
go互斥锁-牛翰网

go互斥锁

互斥锁的定义 type Mutex struct { state int32 sema uint32 } 一个 sema,背后实际上 是一个 休眠队列,可以看下上篇。 一个state,这个状态 分为4个部分。 后三位 各自代表一个状态。 前29位...
10个月前
05510
go读写锁-牛翰网

go读写锁

go读写锁 互斥锁每次只让一 g通过,去读写数据。但是读数据操作,并发其实没有问题。所以诞生了 读写锁。 读协程可以并发,一起读。但是 写协程还是要走互斥锁,只能一个个通过。 先加了读锁 先...
10个月前
0277