ps-next = NULL; // break the loop
return TRUE;
Go语言list(列表)2021-11-10
列表是一种非连续的存储容器,有多个节点组成,节点通过一些变量记录彼此之间的关系
单链表和双链表就是列表的两种方法 。
原理:A、B、C三个人 , B懂A的电话,C懂B的电话只是单方知道号码,这样就形成了一个单链表结构 。
如果C把自己的号码给B,B把自己的号码给A , 因为是双方都知道对方的号码,这样就形成了一个双链表结构
如果B换号码了,他需要通知AC,把自己的号码删了,这个过程就是列表的删除操作 。
在Go语言中,列表使用 container/list 包来实现,内部的实现原理是双链表,列表能够高效地进行任意位置的元素插入和删除操作 。
列表初始化的两种办法
列表没有给出具体的元素类型的限制,所以列表的元素可以是任意类型的 ,
例如给列表中放入了一个 interface{} 类型的值,取出值后,如果要将 interface{} 转换为其他类型将会发生宕机 。
双链表支持从队列前方或后方插入元素,分别对应的方法是 PushFront 和 PushBack 。
列表插入函数的返回值会提供一个 *list.Element 结构 , 这个结构记录着列表元素的值以及与其他节点之间的关系等信息,从列表中删除元素时 , 需要用到这个结构进行快速删除 。
遍历完也能看到最后的结果
学习地址:
Go语言设计与实现(上)基本设计思路:
类型转换、类型断言、动态派发 。ifacego语言反转链表,eface 。
反射对象具有的方法:
编译优化:
内部实现:
实现 Context 接口有以下几个类型(空实现就忽略go语言反转链表了):
互斥锁的控制逻辑:
设计思路:
(以上为写被读阻塞go语言反转链表,下面是读被写阻塞)
总结go语言反转链表 , 读写锁的设计还是非常巧妙的:
设计思路:
WaitGroup 有三个暴露的函数:
部件:
设计思路:
结构:
Once 只暴露了一个方法:
实现:
三个关键点:
细节:
让多协程任务的开始执行时间可控(按顺序或归一) 。(Context 是控制结束时间)
设计思路: 通过一个锁和内置的 notifyList 队列实现,Wait() 会生成票据,并将等待协程信息加入链表中,等待控制协程中发送信号通知一个(Signal())或所有(Boardcast())等待者(内部实现是通过票据通知的)来控制协程解除阻塞 。
暴露四个函数:
实现细节:
部件:
包: golang.org/x/sync/errgroup
作用:开启func() error函数签名的协程,在同 Group 下协程并发执行过程并收集首次 err 错误 。通过 Context 的传入,还可以控制在首次 err 出现时就终止组内各协程 。
设计思路:
结构:
暴露的方法:
实现细节:
注意问题:
包: "golang.org/x/sync/semaphore"
作用:排队借资源(如钱,有借有还)的一种场景 。此包相当于对底层信号量的一种暴露 。
设计思路:有一定数量的资源 Weight,每一个 waiter 携带一个 channel 和要借的数量 n 。通过队列排队执行借贷 。
结构:
暴露方法:
细节:
部件:
细节:
包: "golang.org/x/sync/singleflight"
作用:防击穿 。瞬时的相同请求只调用一次,response 被所有相同请求共享 。
设计思路:按请求的 key 分组(一个 *call 是一个组,用 map 映射存储组) , 每个组只进行一次访问,组内每个协程会获得对应结果的一个拷贝 。
推荐阅读
- chatgpt微软报告,微软周报
- 长时间拍摄设置什么,手机长时间拍摄会坏吗
- 升级鸿蒙3.0后导航信号弱,升级鸿蒙系统后车道导航不准
- fluttervideo控件全屏,flutterviewcontroller
- go语言url包含url golang urlencode
- java图片剪切代码,java实现图片裁剪
- 注册完公众号怎么发文章,注册完公众号怎么发文章给别人
- python传入函数 python函数结果传给变量
- 问ChatGPT流浪气球问题,流浪的气球