近期一同事负责的线上模块,总是时不时的返回一下 504,检查发现,这个服务的内存使用异常的大,pprof分析后,发现有上万个goroutine,排查分析之后,是没有规范使用gorm包导致的,那么具体是什么原因呢,会不会也像 《Go Http包解析:为什么需要response.Body.Close()》 文中一样,因为没有释放连接导致的呢?
GORM之ErrRecordNotFound采坑记录
在我印象中有个错误的认知:如果GORM没有找到record,则会返回ErrRecordNotFound
的错误,知道上次业务中出现了bug,我才发现这个印象中的认知是错误的,且没有官方文档的支持。那么,ErrRecordNotFound
到底在什么时候返回呢,这篇文章将会根据源码来进行分析一下
深入理解Go-map原理剖析
在使用map的过程中,有两个问题是经常会遇到的:读写冲突和遍历无序性。为什么会这样呢,底层是怎么实现的呢?带着这两个问题,我简单的了解了一下map的增删改查及遍历的实现。
深入理解Go-sync.Map原理
Map is like a Go map[interface{}]interface{} but is safe for concurrent use
by multiple goroutines without additional locking or coordination.
Loads, stores, and deletes run in amortized constant time.
上面一段是官方对sync.Map
的描述,从描述中看,sync.Map
跟map
很像,sync.Map
的底层实现也是依靠了map
,但是sync.Map
相对于 map
来说,是并发安全的。
深入理解Go-runtime.SetFinalizer原理剖析
finalizer是与对象关联的一个函数,通过runtime.SetFinalizer
来设置,它在对象被GC的时候,这个finalizer会被调用,以完成对象生命中最后一程。由于finalizer的存在,导致了对象在三色标记中,不可能被标为白色对象,也就是垃圾,所以,这个对象的生命也会得以延续一个GC周期。正如defer一样,我们也可以通过 Finalizer 完成一些类似于资源释放的操作
深入理解go-channel和select的原理
Go最吸引人的两个地方,除了goroutine,也就是channel了,同时,我一直很纳闷,select到底是怎么实现的?跟我之前的文章一样,部分无关的代码直接省略
深入理解Go-goroutine的实现及调度器分析
在学习Go的过程中,最让人惊叹的莫过于goroutine了。但是goroutine是什么,我们用go
关键字就可以创建一个goroutine,这么多的goroutine之间,是如何调度的呢?
深入理解Go-垃圾回收机制
Go的GC自打出生的时候就开始被人诟病,但是在引入v1.5的三色标记和v1.8的混合写屏障后,正常的GC已经缩短到10us左右,已经变得非常优秀,了不起了,我们接下来探索一下Go的GC的原理吧
基于Nginx和dnsmasq实现路由的动态DNS解析
近期在跟前端同学联调的时候,出现了一点小插曲,我们两个的项目是同一个域名,然而,他的本地没有搭服务端的运行环境,所以就导致了前端需要的hosts文件和请求接口需要的hosts文件不一致的情况,基于这种情况,我就考虑是否可以通过nginx来匹配不同的路由,将请求打到不同的机器上面?