LevelDB(go版本)架构设计解析

2021-07-04
阅读 9 分钟
6.3k
leveldb 的写操作并不是直接写入磁盘的,而是首先写入到内存。假设写入到内存的数据还未来得及持久化,leveldb 进程发生了异常,或者是宿主机此时发生了宕机,会造成用户写入数据发生丢失。因此 leveldb 在写内存之前会首先将所有的写操作写到日志文件中,也就是 log 文件。当进程出现异常的时候,可以通过log来进行恢复...
封面图

GORM之for(rows.Next)提前退出别忘了Close

2020-01-05
阅读 19 分钟
5.7k
近期一同事负责的线上模块,总是时不时的返回一下 504,检查发现,这个服务的内存使用异常的大,pprof分析后,发现有上万个goroutine,排查分析之后,是没有规范使用gorm包导致的,那么具体是什么原因呢,会不会也像 《Go Http包解析:为什么需要response.Body.Close()》 文中一样,因为没有释放连接导致的呢?

Go map原理剖析

2019-10-08
阅读 31 分钟
4.9k
在使用map的过程中,有两个问题是经常会遇到的:读写冲突和遍历无序性。为什么会这样呢,底层是怎么实现的呢?带着这两个问题,我简单的了解了一下map的增删改查及遍历的实现。

深入理解Go-runtime.SetFinalizer原理剖析

2019-09-08
阅读 14 分钟
9.3k
finalizer是与对象关联的一个函数,通过runtime.SetFinalizer 来设置,它在对象被GC的时候,这个finalizer会被调用,以完成对象生命中最后一程。由于finalizer的存在,导致了对象在三色标记中,不可能被标为白色对象,也就是垃圾,所以,这个对象的生命也会得以延续一个GC周期。正如defer一样,我们也可以通过 Finalizer...

深入理解Go-defer的原理剖析

2019-09-06
阅读 11 分钟
3.8k
defer 也是Go里面比较特别的一个关键字了,主要就是用来保证在程序执行过程中,defer后面的函数都会被执行到,一般用来关闭连接、清理资源等。

深入理解go-channel和select的原理

2019-09-04
阅读 28 分钟
7.6k
Go最吸引人的两个地方,除了goroutine,也就是channel了,同时,我一直很纳闷,select到底是怎么实现的?跟我之前的文章一样,部分无关的代码直接省略