以此记录那些年 Code Review 遇到的坑😂。 变量作用域 变量应该遵循最小作用域的原则,否者可能引起错乱。 案例1 函数的功能是:将 MongoDB 数据库中所有 offline 是 false 的记录,同步到 Redis 中。 Bad tmpl 的作用域在 for 循环之外,在对每条查询结果做 cursor.Decode 时 tmpl 变量未被重置,这造成之前记录的值可能残留在这次 cursor.Decode 的结果中,从而导致数据错乱。 1func Foo(ctx context.Context) error { 2 cursor, err := …
阅读更多在阅读 Go 源代码的过程,可以看到大量形如 //go:xxx 的注释,虽然很容易猜测到肯定是和编译相关的,但并不清晰,于是就想深入了解一下。 在日常编译可执行文件的过程中,我想大家使用最多的毫无疑问是 go build 。只需一行命令即可将庞大且复杂的项目源代码编译成可执行文件,Go 把复杂的编译过程设计的非常简单、友好。 但是其实 Go 和 C/C++ 一样,也分为 compile 和 link 两个过程,今天我们要讲的就是 compile 过程。 自举 Go 在 1.5 之前使用 C 实现编译器,在 1.5 实现了自举,也就是说 Go 的编译器是使用 Go 语言本身去实现的。 自举对编程语言来说是个里程碑,实现自举包括但不限于 …
阅读更多背景 我司使用GitLab作为代码仓库,Go项目在CICD过程中需要下载依赖,但大部分情况下依赖并未发生变化,重复下载是无用且非常耗时的操作,严重拖慢了CICD的效率。这对于任何一个追求效率的团队来说都是无法接受的。 之前也了解到一些go依赖缓存的解决方案,但不是特别优雅。从 Go 1.15 Release Notes 中看到,该版本新增了 GOMODCACHE 环境变量的支持,官方说明如下: The location of the module cache may now be set with the GOMODCACHE environment variable. The default value of GOMODCACHE …
阅读更多概要 今天我们来看看Go中的互斥锁 sync/mutex。本文基于go1.15.5 进行分析。 我们借用互斥锁在维基百科上的定义:互斥锁(英语:Mutual exclusion,缩写 Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制。该目的通过将代码切片成一个一个的临界区域(critical section)达成。临界区域指的是一块对公共资源进行访问的代码,并非一种机制或是算法。一个程序、进程、线程可以拥有多个临界区域,但是并不一定会应用互斥锁。 在Go中我们无法直接操作线程,使用 go 关键字启动的是goroutine,但goroutine的背后还是操作系统的线程,所以在此我们讨论的 …
阅读更多最近在开发过程中遇到一个比较在编码上无解的问题,最终通过条件编译得到一个比较满意的方案。对于Go的条件编译,可能很多人都了解,甚至不知道。Go通过在行注释的前面编写如下代码来实现条件编译。 1// +build 条件编译的指令可能出现在任何源代码中,不止是*.go文件,可能是go汇编文件。无论是何种源文件,条件编译指令一定都出现在文件的顶部,并且在空行或者其他行注释之前。所以条件编译指令也必须在package语句之前。 编译规则 可以将 // +build 后面的内容当成一个表达式。当表达式返回true时,当前文件参与编译,反之不参与编译。 多个片段之间的空格表示它们之间是OR的关系。如下,表示GOOS值是linux或 …
阅读更多