自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

原创 深入理解 sync.RWMutex 实现原理

读写锁sync.RWMutex,是互斥锁Mutex的一个改进版,适用于读取数据频率远大于写数据频率的场景例如,程序中写操作少而读操作多,如果执行过程是1次写然后N次读的话,使用Mutex这个过程将是串行的,带来的问题是:即便N次读操作互相之间并不影响,也需要获取到Mutex后才可以操作。如果使用读写锁,多个读操作可以同时持有锁,将大大提升并发能力一个协程拥有写锁时,其他协程获取写锁需要阻塞一个协程拥有写锁时,其他协程获取读锁需要阻塞一个协程拥有读锁时,其他协程获取写锁需要阻塞。

2023-06-02 22:32:44 587

原创 深入理解 Go sync.Map

sync.Map是线程安全的通过只读和可写分离,使得查询,更新已存在key的value不需要加锁随着程序的运行,dirty和read的差距会越来越大,使得需要加锁访问dirty的概率变大,效率也下降。因此当misses达到阈值时,将dirty提升为read,减低加锁的概率提升后第一次新增键值对时,会将read浅拷贝一份成为dirty,但会过滤掉entry为nil的键值对当 dirty 为 nil 的时候,read 就代表 map 所有的数据;

2023-05-19 23:34:17 435

原创 Go 连接池的设计与实现

如果不用连接池,而是每次请求都创建一个连接是比较昂贵的,因此需要完成3次tcp握手同时在高并发场景下,由于没有连接池的最大连接数限制,可以创建无数个连接,耗尽文件描述符连接池就是为了复用这些创建好的连接

2023-04-08 13:18:17 869

原创 详解go-zero中滑动窗口的实现

常常有这样的需求:统计过去一段时间内的请求总数,过去一段时间内的平均值这种需求用滑动窗口来实现相当适合。

2023-04-06 23:23:40 633

原创 go并发编程 —— singleflight设计模式

singleflight是一种并发编程设计模式,将的多个并发请求成一个请求,以减少对下游服务的压力。

2023-04-04 00:23:32 264

原创 Golang 如何下载ftp文件

由于不是http协议,不能用go自带的http.client下载因此本文介绍如何下载,读取ftp文件。

2023-04-03 23:21:08 1031

原创 深入理解 Go map (3)—— 遍历

如果map正在扩容中,且是两倍扩容方式,如果当前遍历的新桶对应的老桶还没迁移,只去遍历老桶中将来会迁移到该新桶中的元素。位置上得值是否为0,根据刚才的分析可知,SP+280位置代表hiter变量,那么同时也代表其第一个字段,也就是。这样,即使你是一个写死的 map,仅仅只是遍历它,也大概率不会返回一个固定序列的。如果遍历完了,即bucket又回到了startBucket时,将key,elem设为空,返回。主要是维护遍历过程中必须要知道的信息,比如遍历的进度,当前遍历的key/value是什么。

2023-03-24 00:16:31 968

原创 深入理解 Go map (2)—— 扩容

当调用mapassign当没有正在扩容,元素太多或者太多桶时就会触发扩容怎么判断是否元素过多呢?假设所有桶都装满,负载因子是8,那么当负载因子是6.5时,表示平均来说所有桶了,每次查找和插入,定位到每个桶后平均还要比较3,4次,,此时扩容是很有必要的。最理想的情况是,每个桶的负载因子都是1,这样只需要一次比较就能完成查找和插入操作怎么判断是否有太多桶呢?虽然每个桶的平均负载不高,但是有大量的溢出桶,此时查找和插入效率也会比较低,因为键值对分散在各个溢出桶中,需要不断地去溢出桶中查找插入。

2023-03-21 23:41:09 959

原创 深入理解 Go map (1)—— 基本原理

如果小于8个,则会消耗更多空间,且需要不断的去溢出桶中找,两个桶的空间不是一块分配的,因此大概率不在一个cpu cache中,效率也会降低。定位到桶后,用hash的高8位去桶bmap的tophash数组中挨个匹配,如果匹配成功,且key和桶中对应位置的key相同,则定位到键值对。当桶中装不下更多元素,且key又被hash到这个桶时,就会放到溢出桶,原桶的overflow字段指向溢出桶。对哈希表来说,除了桶的结构以外,最重要的就是如何根据key定位到桶,以及桶中的键值对

2023-03-19 10:20:03 435

原创 深入理解 Go slice 扩容机制

容量小于1024时为2倍扩容,大于等于1024时为1.25倍扩容小于256时为2倍扩容,大于等于256时的扩容因子逐渐从2减低为1.25不管1.18前后,最终需要按照内存分配块向上修正

2023-03-18 14:43:35 768

原创 深入理解Go函数调用原理

在程序运行的过程中,会涉及到对函数的调用,调用时IP寄存器会指向被调用函数的地址,函数返回后继续执行本函数剩下的代码程序执行单元(线程或者协程)在执行过程中需要记录程序上下文的数据结构,包括局部变量,BP,参数,返回值等。程序用栈帧这种结构来记录这些信息这两个信息存在使用BP,SP和IP中:BP:存储函数调用堆栈基址指针的寄存器,即SP:存储当前函数栈顶的位置,也就是IP

2023-03-12 14:16:08 271

原创 Go开发者常犯的错误,及使用技巧 (1)

变量名要有意义,不能随便取a,b,c如果for语句块简短还好,如果很长,顺着读下去在后面可能都不记得v代表什么,如果将v换成user,会减少很多理解成本

2023-02-18 21:02:13 625

原创 go如何实现服务优雅关闭

什么叫优雅关闭?先说不优雅关闭,就是什么都不管,强制关闭进程,这会导致有些正在处理中的请求被强行中断这样做有什么问题?

2023-02-04 21:59:06 991

原创 一文搞懂go并发编程设计原理

主要学习其设计原则,大体流程,权衡利弊不要纠结于部分难懂的实现细节,因为不同的人对相同接口的实现细节不一样,就算是相同的人实现两次也可能不一样。

2023-01-22 12:13:39 919

原创 动态规划 —— 最长上升子序列全解

最长递增子序列

2023-01-15 11:39:54 344

原创 深入理解数据结构 —— 差分

对于一个数组:我们构造一个数组:使得数组a是数组b的前缀和数组,即则数组b就是数组a的差分当我们得到数组b后,只用对b求一遍前缀和,就能得到数组a,耗时假设有如下需求:给一个范围[l,r],对数组a,在这个范围内的数全部加上c如果暴力做,需要每次都耗时但如果用差分做,每次只用耗时,最后再对差分数组求一个前缀和得到原数组那具体怎么用差分做呢?

2023-01-15 09:19:11 981

原创 动态规划系列 —— 背包问题

背包问题是有N件物品,容量为V的背包每个物品有两个属性:体积,价值,分别用数组v,w表示第i件物品的体积为v[i],价值为w[i]计算在背包装得下的情况下,能装的最大价值是多少?

2023-01-14 22:25:04 363

原创 深入理解数据结构 —— 并查集

并查集是一种数据结构,主要能够高效地实现以下两个功能

2023-01-14 10:22:47 739

原创 多图解析manacher算法原理

根据上面的分析,manacher算法的流程可以总结为:i位置比R位置大:暴力扩i位置小于等于Ri扩出来的区域,在(L,R)之间:i的回文半径就是i的回文半径i*扩出来的区域的左边界比L更小:i的回文半径就是从i到R的距离i*扩出来区域的左边界和L重合:i的回文半径至少为从i到R的距离,至于有没有可能更长需要往外扩尝试。

2023-01-13 21:31:41 322

原创 深入理解数据结构 —— 跳表

只要是平衡搜索二叉树能实现的功能,跳表都能实现,且时间复杂度都相同这些操作的时间复杂度都为O(logN)

2023-01-08 13:15:45 557

原创 深入理解数据结构 —— 树状数组

我们知道,前缀和数组能解决任意一段区间的累加和问题但这建立在数组中的元素不发生变化的情况,如果可以修改原始数组中的某个元素,为了让前缀和数组正确

2023-01-07 23:20:37 271

原创 详细分析单调栈,及正确性证明

对于一个数组,需要对每个位置生成,左右两边离它最近的,比它小(或比它大)的

2023-01-07 09:10:40 648

原创 多图解析KMP算法原理

KMP是一种字符串匹配算法,能够判断字符串s2,是否为字符串s1的子串例如:s1 =,s2 ="123",KMP会返回4,代表s2是s1的子串,第一个匹配的下标为3假设s1的数据规模为M

2023-01-07 09:07:44 675

原创 golang实现四舍五入

golang小技巧

2022-12-02 18:36:05 1390

原创 剑指Offer专项突破版(76)—— 数组中的第 k 大的数字

第k大的数

2022-11-30 09:13:27 514

原创 剑指Offer专项突破版(75)—— 数组相对排序

j计数排序

2022-11-28 08:31:33 80

原创 剑指Offer专项突破版(74)—— 合并区间

合并区间

2022-11-26 11:26:22 72

原创 剑指Offer专项突破版(70)—— 排序数组中只出现一次的数字

二分法

2022-11-26 08:29:23 58

原创 剑指Offer专项突破版(68)—— 山峰数组的顶部

非排序数组二分

2022-11-25 09:04:47 128

原创 剑指Offer专项突破版(68)—— 查找插入位置

详细分析二分法

2022-11-25 08:56:13 126

原创 剑指Offer专项突破版(67)—— 最大的异或

最大异或

2022-11-24 10:20:39 65

原创 剑指Offer专项突破版(59)—— 数据流的第 K 大数值

堆的应用

2022-11-23 09:02:34 314

原创 剑指Offer专项突破版(58)—— 日程表

详细分析

2022-11-22 22:07:29 108

原创 剑指Offer专项突破版(57)—— 值和下标之差都在给定的范围内

详细题解

2022-11-22 08:47:44 130

原创 剑指Offer专项突破版(55)—— 二叉搜索树迭代器

原地遍历

2022-11-21 08:51:26 75

原创 剑指Offer专项突破版(54)—— 所有大于等于节点的值之和

所有大于等于节点的值之和

2022-11-21 08:23:39 128

原创 剑指Offer专项突破版(53)—— 二叉搜索树中的中序后继

中序后继

2022-11-20 20:03:42 119

原创 剑指Offer专项突破版(51)—— 节点之和最大的路径

详细解析

2022-11-20 10:55:42 61

原创 剑指Offer专项突破版(50)—— 向下的路径节点之和

前缀和

2022-11-20 10:06:56 126

原创 二叉树前中后序遍历,非递归终极解法

非递归终极解法

2022-11-20 00:01:24 46

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除