go
stevewongbuaa
这个作者很懒,什么都没留下…
展开
-
golang once 理解 原理
使用场景经常用于初始化某些配置,如果不希望在init的时候就初始化而是用到的时候再懒加载,可以使用once。原理参考https://zhuanlan.zhihu.com/p/44360489理解主要是用了一个mutex和一个原子int。个人理解:原子int的成本比mutex低,用于快速判断是否要执行once里的函数最终互斥主要还是靠mutex。看注释的时候遇到一个问题:这里说如果函数f panic了的话,就认为返回了,未来的调用会返回,不会调用f。好奇的是,如果panic了应该整个协程原创 2021-12-22 17:23:09 · 888 阅读 · 0 评论 -
google context
参考https://go.dev/blog/contexthttps://draveness.me/golang/docs/part3-runtime/ch06-concurrency/golang-context/每个请求会在协程处理,一般每个request handler会启动另外的协程去访问后端,比如数据库和rpc。这些协程需要访问request里的值,比如用户身份等。当一个请求取消了或者超时了,所有在这个请求上工作的协程都应该快速退出,让系统可以回收这些协程正在使用的资源google开发了c原创 2021-12-13 20:56:53 · 224 阅读 · 0 评论 -
规则引擎:golang: cel-go
规则引擎:golang: cel-go参考:gohttps://github.com/google/cel-spec/blob/master/doc/langdef.md原创 2021-11-17 14:28:04 · 1713 阅读 · 0 评论 -
go best pratice 记录
一些参考文章Go语言最佳实践Go-advice原创 2021-11-10 11:25:21 · 68 阅读 · 0 评论 -
golang for range的坑
参考核心点for range的时候index和value每次都是同一个空间,然后把相应的数据拷进来,所以如果取地址的话用于都是同一个地址codefunc TestForRange(t *testing.T) { slice := []int{0, 1, 2, 3} myMap := make(map[int]*int) for index, value := range slice { fmt.Println("oriSliceValue", &slice[index]) f原创 2021-11-08 11:57:03 · 203 阅读 · 0 评论 -
golang接口学习
深入了解接口参考接口的本质是引入一个中间层,上游调的时候就直接调接口就行,而不需要关系具体的实现,简单的例子:定义一个phone interface里面有个call 方法那么定义一个struct:nokiephone实现了call 方法就认为nokiaphone实现了接口看下实战一般会怎么使用呢假设一个engine的执行流程是Match -> load -> modify然后需要根据请求中的类型来决定不同的类型的match怎么做,load怎么做,modify怎么做。那么我们原创 2021-11-07 17:07:53 · 79 阅读 · 0 评论 -
如何写batch化处理
开发过程中其实经常需要batch化处理,这是一个写代码的pattern吧,记录一下func doBatch(dataList []int, batchSize int) { numBatches := len(dataList) / batchSize if len(dataList)%batchSize != 0 { numBatches++ } for i := 0; i < numBatches; i++ { startIdx := i * batchSize endIdx原创 2021-05-23 17:19:31 · 408 阅读 · 0 评论 -
golang range + 闭包
golang中 range + 闭包 都有一些容易搞错的点,混在一起就更容易搞错了,记一个例子1、range:遍历的时候key和value都是同一个地址,然后把要遍历的对应的值塞进来,如果遍历过程中用到了这个地址,那将是同一个地址。link2、闭包引用外部变量,会在真正调用的时候根据外部变量的值做出改变link结合在一起的一个测试用例type Res struct { ID int `json:"id"` InitFunc func(*Res) erro原创 2021-04-16 11:05:51 · 439 阅读 · 0 评论 -
golang 并行执行 收集结果 超时控制 失败提前退出
背景有这么个需求1、调用多个服务,pack1、pack2、pack3…,需要并行调用;2、任意一个服务返回失败,提前返回失败3、需要有超时控制不能等待太久4、收集每个服务返回的结果,后面要做处理怎么实现呢?codepackage mainimport ( "code.byted.org/gopkg/logs" "fmt" "github.com/pkg/errors" "time")func pack1(secs time.Duration) (result string,原创 2021-02-23 16:02:50 · 508 阅读 · 0 评论 -
golang LRU cache inmem 原理 源码
LRU cache 还是比较常用的。其原理是map(快速查找) + 链表(快速移动位置到头/尾)我们来看下golang中的包inmem是怎么做的。构造果然,是一个map + 链表list// NewLocked constructs a new Cache of the given size that is safe for// concurrent use. It will panic if size is not a positive integer.func NewLocked(size原创 2020-12-18 10:33:06 · 218 阅读 · 0 评论 -
go: WaitGroup 原理: 直到最底层
参考 [好文](https://draveness.me/golang/docs/part3-runtime/ch06-concurrency/golang-sync-primitives/) 经典用法https://gobyexample.com/waitgroups 构造wg wg.Add(1) defer wg.Done(),也就是wg.Add(-1) 并行搞起 wg.wait() WaitGroup重要变量:counter,waiter,sema(信号量) 推论:count原创 2020-12-07 10:54:12 · 781 阅读 · 0 评论 -
go: 并发
参考好文WaitGroup可太常用了。啥原理?通过Add,Done来同步,估计就是一个counter的办法吧。每次Add+1,Done-1,最后==0就说明完成了。具体细节:看源码:unit32的数组。元素为3个。那就是323位。高32位是counter,低32位是waiter的数量。64位的原子操作,需要64位对齐,但是32位编译器无法保证。所以就分配了12byte(323=96bit),使用对齐的8个byte作为state。??这个没懂。Mutex...原创 2020-12-06 17:15:35 · 78 阅读 · 0 评论 -
go:select channel源码
参考go夜读buffered和unbufferedbuffered:ch <- v happens before v <- ch有buffer的情况下:先把值写到channel,才能读到make(chan interface{}, size) unbuffered:v <- ch happens before ch <- v无buffer呢?先读了,之后才写。(没有中间人拿这个东西)make(chan interface{}, 0)Go Schedule原创 2020-12-02 21:04:42 · 193 阅读 · 0 评论 -
go-demo
发http请求参考飞书这套:DoHttpPostOApito be continued原创 2020-09-23 14:01:11 · 136 阅读 · 0 评论 -
go细节
概念GO111MODULE一开始go发布的时候是没有包管理的go get命令会根据路径,把相应的模块获取并保存在$GOPATH/src也没有版本的概念,master就代表稳定的版本然后why is GO111MODULE everywhere?原创 2020-09-18 19:50:34 · 80 阅读 · 0 评论 -
GO111MODULE 环境变量
GO111MODULE 参考 中文:https://learnku.com/go/t/39086 英文原文:https://dev.to/maelvls/why-is-go111module-everywhere-and-everything-about-go-modules-24k 解析 一开始发布的时候 一开始go发布的时候是没有包管理的 go get命令会根据路径,把相应的模块获取并保存在$GOPATH/src 也没有版本的概念,`master`就代表稳定的版本翻译 2020-09-10 16:45:15 · 2433 阅读 · 0 评论 -
The go programming language - 笔记
序言helloworldgo get xxx获取输入参数 os.Args寻找重复的行:逐行读入、全文件读入画图GIF并行fetch urlWeb Server:简单的echo、复用上面的画图功能,引入接口的概念(io.writer)指针:C没有地址保护;其他只有引用的概念。go在中间,可以看到地址,但是不允许对地址做运算...原创 2020-08-20 16:41:26 · 100 阅读 · 0 评论 -
go学习:特殊之处、语言特性
背景学习一门新语言,其实大多数东西都是类似的,我们只需要关注这么语言特殊的地方。本文就是在学习过程中记录go特殊的地方特殊之处闭包b站git_bookvscode搭建环境defer把语句放到栈中,函数结束的时候再执行一般用于打开文件/数据库后立马defer 关闭,有点像把finally提前package mainimport ( _ "encoding/json" "fmt")func sum(n1 int, n2 int) int { defer fmt.Prin原创 2020-08-11 16:14:56 · 197 阅读 · 0 评论 -
goroutine 锁机制
go的锁:https://www.infoq.com/presentations/go-locks/直接用一个flag为啥不行? 不是原子性的 not atomic reordering 指令重排序 hardware可以实现 x86: XCHG LOCK prefix 很好使(一切的基础) LOCK ADD LOCK CMPXCHG 一步一步地实现,改...翻译 2020-04-21 18:22:30 · 325 阅读 · 0 评论