Go
文章平均质量分 81
JCGKS
这个作者很懒,什么都没留下…
展开
-
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 · 1199 阅读 · 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 · 1032 阅读 · 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 · 1317 阅读 · 0 评论 -
GIN框架路由的实现原理
sync.Pool是sync包下的一个内存池组件用来实现对象的复用,避免重复创建相同的对象,造成频繁的内存分配和gc,以达到提升程序性能的目的,虽然池子中的对象可以被复用,基本思想就是将字符串中的每个字符作为树的一个节点,从根节点开始,每个节点代表代表字符串中的一个前缀。在Trie树,每个节点都包含一个指向子节点的指针数组,数组的大小等于字符集的大小。从两图可以看出,Radix Trie对Trie进行了压缩:遍历Trie发现某个节点只有一个子节点,就与子节点进行合并,减少指针数组的占用,优化空间。原创 2023-10-10 12:04:47 · 292 阅读 · 2 评论