net/http 的 API 使用非常简单,但一次请求仍要经过连接获取、并发读写、Body 回收、超时与取消。沿着客户端和服务端的源码调用链读下去,才能准确解释连接为何没有复用、超时发生在哪一层,以及 Handler 返回后还有哪些工作没有结束。使用 Go 启动一个 HTTP 服务又或者作为客户端进行调用,都只需要几行代码:http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) { f
深入 Go 的 net/http
2021-04-06•约 16.8 千字
Go Slice 奇技淫巧
Go 的切片 (slice) 很容易学:len 是长度,cap 是容量,不够就 append。这三句话足够写完大多数业务代码,也足够埋下不少只有在线上才肯露头的问题。把一个切片赋值给另一个变量,改其中一个,另一个为什么也会变?同样是 append,为什么有时修改原数据,有时又像复制了一份?从大文件中只截取十几个字节,为什么几百 MB 内存还没有释放?两个看起来内容完全相同的空切片,为什么一个等于 nil,一个却不等于?[]byte(string) 是否一定分配?能不能把字符串
2021-03-19•约 11.3 千字
博弈论:死君子不死小人
你准备把商品价格降到 99 元,竞争对手会不会降到 98 元?你想在会议上提出一个方案,同事会支持,还是等你先承担风险?两个国家都知道减排对人类有利,为什么仍然可能互相观望?平台要不要给商家更低抽成,银行要不要提高存款利率,员工要不要主动分享信息——这些问题有一个共同特点:你的结果不仅取决于你做什么,还取决于别人认为你会做什么。这就是博弈论(Game Theory)关心的世界。博弈论不是「教你如何算计别人」的厚黑学,也不是把人生所有选择都变成一张收益表。它是一套分析战略互动的
2021-01-03•约 18.9 千字
QQ 安全中心动态密钥
不得不说,有现成的技术方案不用,非要跑去魔改一个,这真是国内众多大厂的特征之一,QQ 安全中心的动态密钥就是如此。现有的 One Time Password 方案大多分为 HOTP 和 TOTP,前者基于事件,后者基于时间。在两步验证的安全策略中,大多数都是采用基于时间的 TOTP 算法。TOTP 算法一般来说都是通用的,因为都是遵循 RFC 6238 来实现的。而 QQ 安全中心的算法是魔改 RFC 6238 实现的,导致除了它自己的客户端,其他的 TOTP 客户端都没办法
2020-08-30•约 2.0 千字






