一个select死锁问题

话说前几天我遇到了一个死锁问题,当时想了一些办法糊弄过去了,不过并没有搞明白问题的细节,周末想起来便继续研究了一下,最终便有了这篇文章。 让我们搞一段简单的代码来重现一下当时我遇到的问题: package main import sync func main() { var wg sync.WaitGroup foo := make(chan int) bar := make(chan int) closing := make(chan struct{}) w

一个select死锁问题

话说前几天我遇到了一个死锁问题,当时想了一些办法糊弄过去了,不过并没有搞明白问题的细节,周末想起来便继续研究了一下,最终便有了这篇文章。 让我们搞一段简单的代码来重现一下当时我遇到的问题: package main import sync func main() { var wg sync.WaitGroup foo := make(chan int) bar := make(chan int) closing := make(chan struct{}) w

在docker环境导入私有仓库的问题

最近我遇到了一个在 docker 环境导入私有仓库的问题:一个 Golang 项目,使用 gitlab ci 来发布,通过 gitlab runner 调用 docker-compose 来打包,但是在构建时失败了。 让我们重回案发现场,看看问题是怎么产生的: 首先是 .gitlab-ci.yml 文件,其相关代码片段内容如下: build_job: stage: build script: - make docker-build 然后是 Makefile

在docker环境导入私有仓库的问题

最近我遇到了一个在 docker 环境导入私有仓库的问题:一个 Golang 项目,使用 gitlab ci 来发布,通过 gitlab runner 调用 docker-compose 来打包,但是在构建时失败了。 让我们重回案发现场,看看问题是怎么产生的: 首先是 .gitlab-ci.yml 文件,其相关代码片段内容如下: build_job: stage: build script: - make docker-build 然后是 Makefile

记又一次对Makefile的重构

我平常有一个习惯,就是不断看以前写的代码,想着有没有哪些方面可以改进,如果每天能把代码可读性量变​ 1%,那么日积月累就是质变:前些天我们写过一次对 Makefile 的重构,去掉了一处重复代码的坏味道,没过多久我便又发现了一处重复代码的坏味道,本文就让我们看看如何消灭它! 让我们先把问题的来龙去脉搞清楚,在 Golang 项目里,一般推荐在根目录创建一个名为 tools.go 的文件,里面记录本项目依赖的相关工具,比如我的某个项目的 tools.go 如下: // +bu

记又一次对Makefile的重构

我平常有一个习惯,就是不断看以前写的代码,想着有没有哪些方面可以改进,如果每天能把代码可读性量变​ 1%,那么日积月累就是质变:前些天我们写过一次对 Makefile 的重构,去掉了一处重复代码的坏味道,没过多久我便又发现了一处重复代码的坏味道,本文就让我们看看如何消灭它! 让我们先把问题的来龙去脉搞清楚,在 Golang 项目里,一般推荐在根目录创建一个名为 tools.go 的文件,里面记录本项目依赖的相关工具,比如我的某个项目的 tools.go 如下: // +bu

记一次对Makefile的重构

如果你不了解 Makefile 的话,那么推荐看看阮一峰的文章「Make 命令教程」。本文通过一个重构的例子带你写出味道更好的 Makefile,让我们开始吧! 假设有一个名为 foo 的项目,用 golang 开发,在 docker 上部署,其 Makefile 如下: APP = $(shell basename ${CURDIR}) TAG = $(shell git log --pretty=format:%cd.%h --date=short -1) .PHON

记一次对Makefile的重构

如果你不了解 Makefile 的话,那么推荐看看阮一峰的文章「Make 命令教程」。本文通过一个重构的例子带你写出味道更好的 Makefile,让我们开始吧! 假设有一个名为 foo 的项目,用 golang 开发,在 docker 上部署,其 Makefile 如下: APP = $(shell basename ${CURDIR}) TAG = $(shell git log --pretty=format:%cd.%h --date=short -1) .PHON

关于OCR项目的流水账

最近一直在开发某个 OCR 项目:底层用的是 ABBYY 提供的 FineReader 引擎,应用层把 FineReader 包装成 gRPC 对外提供服务,因为 FineReader 项目是 C++ 实现的,而我们团队使用的编程语言是 Golang,所以二者间通过 CGO 来完成交互。整个项目没有什么特殊的需求,只是鉴于 OCR 耗时较长,为了提升产品体验,要求在处理过程中:客户端可以主动退出;服务端能够实时返回已处理百分比。下面是根据需求画出来的流程图: 流程图 看上去很

关于OCR项目的流水账

最近一直在开发某个 OCR 项目:底层用的是 ABBYY 提供的 FineReader 引擎,应用层把 FineReader 包装成 gRPC 对外提供服务,因为 FineReader 项目是 C++ 实现的,而我们团队使用的编程语言是 Golang,所以二者间通过 CGO 来完成交互。整个项目没有什么特殊的需求,只是鉴于 OCR 耗时较长,为了提升产品体验,要求在处理过程中:客户端可以主动退出;服务端能够实时返回已处理百分比。下面是根据需求画出来的流程图: 流程图 看上去很