以此记录那些年 Code Review 遇到的坑😂。 变量作用域 变量应该遵循最小作用域的原则,否者可能引起错乱。 案例1 函数的功能是:将 MongoDB 数据库中所有 offline 是 false 的记录,同步到 Redis 中。 Bad tmpl 的作用域在 for 循环之外,在对每条查询结果做 cursor.Decode 时 tmpl 变量未被重置,这造成之前记录的值可能残留在这次 cursor.Decode 的结果中,从而导致数据错乱。 1func Foo(ctx context.Context) error { 2 cursor, err := …
阅读更多信创是什么? 信创二字来源于“信息技术应用创新工作委员会”。2016年3月4日工委会成立,是由从事信息技术软硬件关键技术研究、应用和服务的企事业单位发起建立的非营利性社会组织。 信创产业,即信息技术应用创新产业。信创产业推进的背景在于,过去中国IT底层标准、架构、产品、生态大多数都由国外IT商业公司来制定,由此存在诸多的底层技术、信息安全、数据保存方式被限制的风险。 全球IT生态格局将由过去的“一极”向未来的“两极”演变,中国要逐步建立基于自己的IT底层架构和标准。基于自有IT底层架构和标准建立起来的IT产业生态便是信创产业的主要内涵。 跟我们有什么关系? 根据xxxxx《xxxxx》([2021]221号文)要求,xxxxx决定成 …
阅读更多在阅读 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的背后还是操作系统的线程,所以在此我们讨论的 …
阅读更多