2020年9月5日
作为一个终身学习者,输入和输出是必不可少的。输入多了之后,会发现很多中文文章很难读,可能还有很多错漏之处。不客气地说,输入的是垃圾,输出的只能是垃圾。 曹大经常说需要多看英文资料,包括各种新出的英文书、文章等等,这从他的书单也可以看出来。我自己的情况是:英文资料读的不多,英文技术书……
阅读全文
2020年5月10日
第一章 设计模式入门 使用模式最好的方式是:”把模式装进脑子里,然后在你的设计和已有的应用中,寻找何处可以使用它们。” 通过一个给 Duck 类型添加 fly 功能的实例,一步步地提出解决方案。 先是使用继承,但是继承并不能很好地解决问题,因为鸭子的行为在子类里不断地改变,并且让所有的子类都有这些行为是不……
阅读全文
2020年5月6日
工作中,经常会碰到并发读写 map 而造成 panic 的情况,为什么在并发读写的时候,会 panic 呢?因为在并发读写的情况下,map 里的数据会被写乱,之后就是 Garbage in, garbage out,还不如直接 panic 了。 是什么 Go 语言原生 map 并不是线程安全的,对它进行并发读写操作的时候,需要加锁。而 sync.map 则是一种并发安全的 map,在 Go 1.9 引入。 sync.map……
阅读全文
2020年4月27日
最近遇到了一起依赖升级 + 异常数据引发的线上事故,教训惨痛,本文对此进行回故和总结。 背景 起因是我们使用的服务框架版本比较老,GC 次数的 metrics 打点一直为 0,咨询了相关同学后,决定升级框架。升级的过程中,出现了 use of internal package xxx not allowed 的报错,又咨询了一下相关同学后,尝试使用 go mod 解决。 从 go vendor 到 go mod 的升……
阅读全文
2020年4月20日
最近在工作中碰到了 GC 的问题:项目中大量重复地创建许多对象,造成 GC 的工作量巨大,CPU 频繁掉底。准备使用 sync.Pool 来缓存对象,减轻 GC 的消耗。为了用起来更顺畅,我特地研究了一番,形成此文。本文从使用到源码解析,循序渐进,一一道来。 本文基于 Go 1.14 是什么 sync.Pool 是 sync 包下的一个组件,可以作为保存临时取还对……
阅读全文
2020年4月3日
很多时候,当我们跟着源码去理解某种事物时,基本上可以认为是以时间顺序展开,这是编年体的逻辑。还有另一种逻辑,纪传体,它以人物为中心编排史事,使得读者更聚焦于某个人物。以一种新的视角,把所有的事情串连起来,令人大呼过瘾。今天我们试着以这样一种逻辑再看 g0。 回顾一下 Go 夜读第 78 期,关于……
阅读全文
2020年3月23日
去年开始写文章的第一篇就是关于 defer,名字比较文艺:《Golang 之轻松化解 defer 的温柔陷阱》,还被吐槽了。因为这篇文章,到《Go 夜读》讲了一期。不过当时纯粹是应用层面的,也还没有跳进 Go 源码这个大坑,文章看着比较清新,也没有大段的源码解析。 自从听了曹大在《Go 夜读》分享的 Go 汇编,……
阅读全文
2020年3月8日
第一章 MySQL 的灵活性体现在很多方面,但其中最与众不同的特性是它的存储引擎架构:将查询处理以及其他系统任务和数据的存储/提取相分离。这种设计使得我们可以在使用时根据性能、特性,以及其他需求来选择数据存储的方式。 MySQL 架构整体上分为三层:第一层处理连接、权限等;第二层包含所有核心的功能,例如……
阅读全文
2019年11月10日
相信很多人都听过“雷神 3”关于性能优化的故事。在一个 3D 游戏引擎的源码里,John Carmack 将 1/sqrt(x) 这个函数的执行效率优化到了极致。 一般我们使用二分法,或者牛顿迭代法计算一个浮点数的平方根。但在这个函数里,作者使用了一个“魔数”,根本没有迭代,两步就直接算出了平方根。令人叹为观止! 因为它是最底……
阅读全文
2019年9月18日
写过 C 的同学知道,C 语言中常常返回整数错误码(errno)来表示函数处理出错,通常用 -1 来表示错误,用 0 表示正确。 而在 Go 中,我们使用 error 类型来表示错误,不过它不再是一个整数类型,是一个接口类型: 1type error interface { 2 Error() string 3} 它表示那些能用一个字符串就能说清的错误。 我们最常用的就是 errors.New() 函数,非常简单:……
阅读全文