2021年8月29日
这个问题的答案是:不能。 如果你还想知道更多的信息,就往下看。^_^ 有些时候我们希望有这样的写法:定义一个参数为 []interface 的函数,在程序运行的过程中,传入 []int 或其他类型的 slice,以此来达到少写一些代码的目的。譬如下面这个弱智的求 slice 和的例子: 1package main 2 3import "fmt" 4 5func sliceSum(inters []interface{}) (res interface{}) { 6 nums := inters.([]int) 7 8 sum := 0 9 for _,……
阅读全文
2021年8月8日
熟悉 map 结构体的读者应该知道,hmap 由很多 bmap(bucket) 构成,每个 bmap 都保存了 8 个 key/value 对: 有时落在同一个 bmap 中的 key/value 太多了,超过了 8 个,就会由溢出 bmap 来承接,即 overflow bmap(后面我们叫它 bucket)。溢出的 bucket 和原来的 bucket 形成一个“拉链”。 对于这些 overflow 的 bucket,在 hmap 结构体和 bmap 结构……
阅读全文
2021年8月3日
之前写了一篇《成为 Go Contributor》 的文章,讲了如何给 Go 提一个 typo 的 pr,以此熟悉整个流程。当然,离真正的 Contributor 还差得远。 开课前曹大在 Go 夜读上讲了他给 Go 提的一个关于 tls 的性能优化,课上又细讲了下,本文就带大家来学习下他优化了啥以及如何看优化效果。 第一次提的 pr 在这里,之后又挪到了一……
阅读全文
2021年7月21日
不知道你有没有这样的经验:看了很多计算机相关的书,觉得自己懂得很多,但是一遇到实际问题,就不会解。 再看身边的老司机,执行几行命令,看了几个指标,就准确地定位问题了。他可能也没看那么多理论,但实战能力确实强,心里一下子就失衡了。 这其中有很多原因,我认为其中有一个比较重要的就是:工具……
阅读全文
2021年7月19日
最近线上事故频发,搞得焦头烂额,但是能用上跟曹大学的知识并定位出了问题,还是值得高兴一把的。毕竟“打破砂锅问到底”,“定位出根因”一直是技术人的优良品质。 虽然我们总是逃不过事故驱动开发的魔咒,但吃一堑长一智,看别人的事故,学到的是自己的能力。 现象 一个平凡的午高峰,服务在全量上线的……
阅读全文
2021年7月15日
最近一个年久失修的库导致了线上事故,不得不去做一些改进。 这个陈年库的作用是调用第三方的 RPC 拿一些比较重要的配置,业务代码中有段逻辑会根据读到的配置调用不同端的下游。如果没拿到配置,就会默认地调一个兜底下游。恰好这个兜底下游最近新上了一些逻辑,不兼容这种跨端调用,直接把它打挂了。 先抛……
阅读全文
2021年6月10日
这篇文章主要来讲一下怎么做动画。 其实只要掌握几个核心的要点,就可以学会怎么用 Figma 做动画了。 我们想一下小时候看的那种胶片电影: 每一张胶片上的影像都是静止的,但是当胶片连续滚动时,静止的图片就变成了连续的视频。 或者想像一下小时候我们看的那种武打的小人书,连着翻页,就能看到一个连续的打斗……
阅读全文
2021年6月7日
有同学在用 dlv 调试时看到了令人不解的 goexit:goexit 函数是啥,为啥 go fun(){}() 的上层是它?看着像是一个“退出”函数,为什么会出现在最上层? 其实如果看过 pprof 的火焰图,也会经常看到 goexit 这个函数。 我们来个例子重现一下: 1package main 2 3import "time" 4 5func main() { 6 go func () { 7 println("hello world") 8 }() 9 10 time.Sleep(10*time.Minute) 11} 启动 dlv 调试,并分别在不同的……
阅读全文
2021年6月1日
抽象语法树是编译过程中的一个中间产物,一般简单了解一下就行了。但我们可以把 Go 语言的整个 parser 和 ast 包直接拿来用,在一些场景下有很大的威力。 什么是 ast 呢,我从维基百科上摘录了一段: 在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代……
阅读全文
2021年5月27日
今天介绍几个常用的查看 Go 汇编代码、调试 Go 程序的命令和工具,既可以在平时和同事、网友抬杠时使用,还能在关键时刻打他们的脸。 比如,有同事说这段代码: 1package main 2 3type Student struct { 4 Class int 5} 6 7func main() { 8 var a = &Student{1} 9 println(a) 10} 的执行效率要高于下面这段代码: 1package main 2 3type Student struct { 4 Class int 5} 6 7func main() { 8 var a = Student{1} 9 var b = &a 10 println(b) 11} 并且……
阅读全文