项目最近几个版本开始使用 context 包,主要用于透传参数。由于不够熟悉 context,我在优化代码时遇到了这样的问题。
func main() {
ctx := context.WithValue(context.Background(), true, 1)
fun(ctx)
log.Println(ctx.Value(true))
// 1
}
func fun(ctx context.Context) {
ctx = context.WithValue(ctx, true, 2)
}
在我的印象中,一个函数如果入口是 interface,那么实际的传参往往是指针。可是 context 包导出的函数全部是传值,而不是指针。这导致护照购买时购买失败。好在测试小姐姐及时发现了这个错误,没有酿成大错。
这个故事告诉我们,一定要在理解代码的基础上做优化,不然会成为负优化。