获取 P 本地队列,当从绑定 P 本地 runq 上找不到可执行的 g,尝试从全局链 表中拿,再拿不到从 netpoll 和事件池里拿,最后会从别的 P ...
调度器把 G 都分配到 M 上,不同的 G 在不同的 M 并发运行时,都需要向系统申 请资源,比如堆栈内存等,因为资源是全局的,就会因为资源竞争照成很多性...
Golang 在语言级别支持协程,称之为 Goroutine。Golang 标准库提供的所有 系统调用操作(包括所有的同步 I/O 操作),都会出让 CP...
对于很多需要重复分配、回收内存的地方,sync.Pool 是一个很好的选择。频 繁地分配、回收内存会给 GC 带来一定的负担,严重的时候会引起 CPU 的...
WaitGroup 主要维护了 2 个计数器,一个是请求计数器 v,一个是等待计数 器 w,二者组成一个 64bit 的值,请求计数器占高 32bit,等...
一个 WaitGroup 对象可以等待一组协程结束。使用方法是:main 协程通过调用 wg.Add(delta int) 设置 worker 协程的个数...
func (c *Cond) Wait() Wait()会自动释放 c.L 锁,并挂起调用者的 goroutine。之后恢复执行, Wait()会在返回时...
func (c *Cond) Broadcast() Broadcast 会唤醒所有等待 c 的 goroutine。调用 Broadcast 的时候,可...
锁已被占用,并且锁不处于饥饿模式。积累的自旋次数小于最大自旋次数(active_spin=4)。CPU 核数大于 1。有空闲的 P。当前 Goroutin...
正常模式(非公平锁) 正常模式下,所有等待锁的 goroutine 按照 FIFO(先进先出)顺序等待。唤醒 的 goroutine 不会直接拥有锁,而是...
channel 中使用了 ring buffer(环形缓冲区) 来缓存写入的数据。ring buffer 有很多好处,而且非常适合用来实现 FIFO 式...
Go 语言中,不要通过共享内存来通信,而要通过通信来实现内存共享。Go 的 CSP(Communicating Sequential Process)并发...
Go 语言中 map 采用的是哈希查找表,由一个 key 通过哈希函数得到哈希值,64 位系统中就生成一个 64bit 的哈希值,由这个哈希值将 key ...
Golang 中 map 的底层实现是一个散列表,因此实现 map 的过程实际上就是实现 散表的过程。在这个散列表中,主要出现的结构体有两个,一个叫 hm...
Go 语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。因为拷 贝的内容有时候是非引用类型(int、string、struct 等这些),这样就...
情况一: 原数组还有容量可以扩容(实际容量没有填充完),这种情况下,扩容以后的 数组还是指向原来的数组,对一个切片的操作可能影响多个指针指向相同地址 的...
Go 中切片扩容的策略是这样的:首先判断,如果新申请容量大于 2 倍的旧容量,最终容量就是新申请的容 量否则判断,如果旧切片的长度小于 1024,则最终容...
切片是基于数组实现的,它的底层是数组,它自己本身非常小,可以理解为对 底层数组的抽象。因为基于数组实现,所以它的底层的内存是连续分配的,效 率非常高,还可...
defer的作用是: 你只需要在调用普通函数或方法前加上关键字defer,就完成了defer所需要的语法。当defer语句被执行时,跟在defer后面的函...
举例说明值传递只会把参数的值复制一份放进对应的函数,两个变量的地址不同,不可相互修改。地址传递(引用传递)会将变量本身传入对应的函数,在函数中可以对该变量...
数组: 数组固定长度。数组长度是数组类型的一部分,所以[3]int和[4]int是两种不同的数组类型数组需要指定大小,不指定也会根据初始化,自动推算出大小...
虽然这三个函数,都是格式化输出,但是输出的目标不一样Printf是标准输出,一般是屏幕,也可以重定向。 Sprintf()是把格式化字符串输出到指定的字符...
make的作用是为slice, map or chan的初始化 然后返回引用 make函数是内建函数,函数定义:func make(Type, size ...
new创建一个该类型的实例,并且返回指向该实例的指针。new函数是内建函数,函数定义:func new(Type) *Type 使用new函数来分配空间传...
go convey是一个支持Golang的单元测试框架go convey能够自动监控文件修改并启动测试,并可以将测试结果实时输出到Web界面go conv...
如果给一个 nil 的 channel 发送数据,会造成永远阻塞。如果从一个 nil 的 channel 中接收数据,也会造成永久阻塞。给一个已经关闭的 ...
当一个Goroutine(协程)获得了Mutex后,其他Goroutine(协程)就只能乖乖的等待,除非该Goroutine释放了该Mutex。RWMut...
如果两个接口有相同的方法列表,那么他们就是等价的,可以相互赋值。如果接口A的方法列表是接口B的方法列表的自己,那么接口B可以赋值给接口A。接口查询是否成功...
类型开关(Type Switch)是在运行时检查变量类型的最佳方式。类型开关按类型而不是值来评估变量。每个 Switch 至少包含一个case用作条件语句...
一个 Goroutine 是一个函数或方法执行同时旁边其他任何够程采用了特殊的 Goroutine线程。Goroutine 线程比标准线程更轻量级,大多数...
包 (pkg) 是 Go 工作区中包含 Go 源文件或其他包的目录。源文件中的每个函数、变量和类型都存储在链接包中。每个 Go 源文件都属于一个包,该包在...
Golang 使用以下类型:MethodBoolStringArraySliceStructPointerFunctionInterfaceMapChannel
与其他作为学术实验开始的语言不同,Go 代码的设计是务实的。每个功能和语法决策都旨在让程序员的生活更轻松。Golang 针对并发进行了优化,并且在规模上运...
答案1:slice内存泄漏分析(1)发生场景:截取长slice中的一段导致长slice未释放 由于底层都是数组,如果截图长slice的一段,其实...
已加贵站~
name: 技研录
link: https://linmohan.fun/
avatar: https://linmohan.fun/img/favicon.png
descr: 「代码重构世界,逻辑解构真理」