[]int 能转换为 []interface 吗?

这个问题的答案是:不能。 如果你还想知道更多的信息,就往下看。^_^ 有些时候我们希望有这样的写法:定义一个参数为 []interface 的函数,在程序运行的过程中,传入 []int 或其他类型的 slice,以此来达到少写一些代码的目的。譬如下面这个弱智的求 slice 和的例子: package main import "fmt" func sliceSum(inters []interface{}) (res interface{}) { nums := inters.([]int) sum := 0 for _, num := range nums { sum……

阅读全文

曹大带我学 Go(11)—— 从 map 的 extra 字段谈起

熟悉 map 结构体的读者应该知道,hmap 由很多 bmap(bucket) 构成,每个 bmap 都保存了 8 个 key/value 对: 有时落在同一个 bmap 中的 key/value 太多了,超过了 8 个,就会由溢出 bmap 来承接,即 overflow bmap(后面我们叫它 bucket)。溢出的 bucket 和原来的 bucket 形成一个“拉链”。 对于这些 overflow 的 bucket,在 hmap 结构体和 bmap 结构……

阅读全文

曹大带我学 Go(10)—— 如何给 Go 提性能优化的 pr

之前写了一篇《成为 Go Contributor》 的文章,讲了如何给 Go 提一个 typo 的 pr,以此熟悉整个流程。当然,离真正的 Contributor 还差得远。 开课前曹大在 Go 夜读上讲了他给 Go 提的一个关于 tls 的性能优化,课上又细讲了下,本文就带大家来学习下他优化了啥以及如何看优化效果。 第一次提的 pr 在这里,之后又挪到了一……

阅读全文

曹大带我学 Go(9)—— 开始积累自己的工具库

不知道你有没有这样的经验:看了很多计算机相关的书,觉得自己懂得很多,但是一遇到实际问题,就不会解。 再看身边的老司机,执行几行命令,看了几个指标,就准确地定位问题了。他可能也没看那么多理论,但实战能力确实强,心里一下子就失衡了。 这其中有很多原因,我认为其中有一个比较重要的就是:工具……

阅读全文

曹大带我学 Go(8)—— 一个 metrics 打点引发的事故

最近线上事故频发,搞得焦头烂额,但是能用上跟曹大学的知识并定位出了问题,还是值得高兴一把的。毕竟“打破砂锅问到底”,“定位出根因”一直是技术人的优良品质。 虽然我们总是逃不过事故驱动开发的魔咒,但吃一堑长一智,看别人的事故,学到的是自己的能力。 现象 一个平凡的午高峰,服务在全量上线的……

阅读全文

曹大带我学 Go(7)—— 如何优雅地指定配置项

最近一个年久失修的库导致了线上事故,不得不去做一些改进。 这个陈年库的作用是调用第三方的 RPC 拿一些比较重要的配置,业务代码中有段逻辑会根据读到的配置调用不同端的下游。如果没拿到配置,就会默认地调一个兜底下游。恰好这个兜底下游最近新上了一些逻辑,不兼容这种跨端调用,直接把它打挂了。 先抛……

阅读全文

曹大带我学 Go(6)—— 技术之外

这篇文章主要来讲一下怎么做动画。 其实只要掌握几个核心的要点,就可以学会怎么用 Figma 做动画了。 我们想一下小时候看的那种胶片电影: 每一张胶片上的影像都是静止的,但是当胶片连续滚动时,静止的图片就变成了连续的视频。 或者想像一下小时候我们看的那种武打的小人书,连着翻页,就能看到一个连续的打斗……

阅读全文

曹大带我学 Go(5)—— 哪来里的 goexit?

有同学在用 dlv 调试时看到了令人不解的 goexit:goexit 函数是啥,为啥 go fun(){}() 的上层是它?看着像是一个“退出”函数,为什么会出现在最上层? 其实如果看过 pprof 的火焰图,也会经常看到 goexit 这个函数。 我们来个例子重现一下: package main import "time" func main() { go func () { println("hello world") }() time.Sleep(10*time.Minute) } 启动 dlv 调试,并分别在不同的地方打上断点:……

阅读全文

曹大带我学 Go(4)—— 初始 ast 的威力

抽象语法树是编译过程中的一个中间产物,一般简单了解一下就行了。但我们可以把 Go 语言的整个 parser 和 ast 包直接拿来用,在一些场景下有很大的威力。 什么是 ast 呢,我从维基百科上摘录了一段: 在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代……

阅读全文

曹大带我学 Go(3)—— 如何用汇编打同事的脸

今天介绍几个常用的查看 Go 汇编代码、调试 Go 程序的命令和工具,既可以在平时和同事、网友抬杠时使用,还能在关键时刻打他们的脸。 比如,有同事说这段代码: package main type Student struct { Class int } func main() { var a = &Student{1} println(a) } 的执行效率要高于下面这段代码: package main type Student struct { Class int } func main() { var a = Student{1} var b = &a println(b) } 并且给你讲了一通道理,你好……

阅读全文