
Go
文章平均质量分 87
JCGKS
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
sync|Mutex、RWMutex源码分析
饥饿模式对于阻止某个goroutine被饿死有重要意义[饥饿模式是计算机科学和工程领域的一个概念,指的是某些进程或任务由于不断被其他优先级更高的进程抢占或延迟而无法取得进展或完成的情况。对于RLock的调用,对于任何对RLock的调用,都存在一个n,使得对Unlock的第n次调用在对RLock的调用之前“同步”,并且对应的对RUnlock的调用在对Lock的第n+1次调用之前“同步”。正常模式,锁等待者按照先入先出的顺序排队,但是一个被唤醒的锁等待者并没有真正的拥有锁,需要和新到来的获取锁者进行竞争。原创 2025-06-07 04:47:52 · 908 阅读 · 0 评论 -
go|context源码解析
首先看一下源码对“context”的描述,当一个Context被取消时,所有从它派生的Context也会被取消。WithCancel、WithDeadline和WithTimeout函数接受一个Context(父类)并返回一个派生Context(子类)和一个CancelFunc。调用CancelFunc会取消子context及其由该context派生出的子context,移除父context对子context的引用,并停止所有相关的计时器。原创 2025-05-31 23:31:37 · 1199 阅读 · 0 评论 -
go|channel源码分析
这篇文章接着分析channel。原创 2025-05-31 22:04:33 · 946 阅读 · 1 评论 -
go|sync系列:WaitGroup、Once、Cond
对于Add操作原子操作将state高32bits计数器的值增加delta获取state中计数器的值为v,阻塞等待的协程数量为w如果v==delta则表明是第一次执行add操作,需要同步给wait如果 v<0,计数器的值小于0,产生panic如果v==delta但是w!=0说明Add操作和wait操作并发执行产生panicv==0 && w>0说明计数器变为0,并且有被wait操作阻塞的协程,此时需要将state的值变为0,并以此释放信号量唤醒阻塞等待的waiter。!原创 2024-03-21 17:41:33 · 1337 阅读 · 2 评论 -
go|一道算法题引发的思考|slice底层剖析
go中的copy函数可以做到这个,接下来看看切片复制的原理。小对象(<=32KB)可以直接分配在P拥有的cache的空闲链表中[这里的P是指GMP中的P,cache和go的内存管理有关,指的是mcache],大对象(>32KB)直接在堆上分配。切片截取会复制slice struct中的三个字段:array[unsafe.Pointer]、len[int]、cap[int],所以由一个切片截取出来的切片会指向同一个底层数组。但是需要注意的是,切片之间共享的是底层的数组,len和cap变量的值是没有共享的。原创 2024-03-08 15:39:07 · 1099 阅读 · 0 评论 -
解决“invalid UTF-8 encoding”
出现上述问题的原因在于"记事本的默认编码是ANSI,而go的默尔编码是UTF-8",所以将其改变为"UTF-8"编码即可。问题“invalid UTF-8 encoding”,无效的utf8编码。有可能是文件的编码不是“utf8”为了验证猜想,看一下“xxx.go”文件的编码方式。之后可以看到文件的编码方式为"UTF-8"go run xxx.go出现以下的问题。再次运行该文件,运行成功。原创 2024-01-07 17:50:05 · 2631 阅读 · 0 评论 -
GIN框架路由的实现原理
sync.Pool是sync包下的一个内存池组件用来实现对象的复用,避免重复创建相同的对象,造成频繁的内存分配和gc,以达到提升程序性能的目的,虽然池子中的对象可以被复用,基本思想就是将字符串中的每个字符作为树的一个节点,从根节点开始,每个节点代表代表字符串中的一个前缀。在Trie树,每个节点都包含一个指向子节点的指针数组,数组的大小等于字符集的大小。从两图可以看出,Radix Trie对Trie进行了压缩:遍历Trie发现某个节点只有一个子节点,就与子节点进行合并,减少指针数组的占用,优化空间。原创 2023-10-10 12:04:47 · 398 阅读 · 2 评论