最稳定纯Go一维码生成库是github.com/boombuler/barcode,支持EAN-13等格式,输出image.Image;EAN-13需严格13位数字含校验位,须补静区、加文字、缩放控制,识别应交由外部服务而非硬啃本地库。

用 github.com/microcosm-cc/bluemonday?不,那是 HTML 过滤库——条形码得用 github.com/boombuler/barcode
Go 生态里最稳定、无需 CGO、纯 Go 实现的一维码生成库是 github.com/boombuler/barcode。它支持 Code128、EAN-13、UPC-A、ITF、Code39 等主流格式,输出为 *image.Image,可直接写入 PNG/JPEG 或嵌入 PDF。别被名字误导——bluemonday 和条形码完全无关,搜错库会导致编译失败或 panic。
生成 EAN-13 条形码:长度和校验位必须严格满足规范
EAN-13 要求输入字符串恰好 13 位数字,且最后一位是按算法算出的校验位。传入 12 位或含字母会触发 barcode.InvalidLengthError 或静默生成错误图案。
- 用
barcode.MustEncode(<code>ean13, "5901234123457") 生成标准 EAN-13 图像(注意:第 13 位是校验位,不能省略) - 若只有前 12 位(如
"590123412345"),需调用ean13.CalculateCheckDigit("590123412345")补全 - 生成后建议用
image/png.Encode()输出,不要直接用fmt.Println打印图像对象——那只会输出内存地址
识别条形码?Go 原生不支持,得靠 OpenCV 绑定或 HTTP API
boombuler/barcode 只负责生成,不提供识别能力。Go 没有成熟、免依赖的纯 Go 条形码识别库。常见方案有:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 用
gocv(OpenCV 的 Go binding)调用Cv2.QRCodeDetector.DetectAndDecode()——但仅支持 QR,对一维码需额外训练或调用zbar库(需系统安装 zbarimg) - 更稳妥的做法是起一个轻量 HTTP 服务(如 Python +
pyzbar),Go 端用http.Post()上传图片 base64,返回解码结果 - 避免在生产环境尝试用
github.com/sj14/gobarcodereader:该库已归档,不维护,且对模糊/倾斜图像识别率极低
生成时字体、尺寸、边距这些细节容易被忽略
默认生成的条形码不带文字(human-readable text),也无左右空白区(quiet zone),扫不出来是常态。
立即学习“go语言免费学习笔记(深入)”;
- 加文字:用
barcode.Scale()缩放后,再用draw.Draw()和font.Face手动绘制底部数字——boombuler/barcode不内置文本渲染 - 补安静区:生成后用
subImage扩展画布,左侧加 10px 白边,右侧加 15px 白边(EAN-13 要求左右 quiet zone ≥ 10×最小模块宽度) - 尺寸控制:别直接设
scale := 2,应先用barcode.Width()获取原始宽度,再乘以缩放系数,否则不同码制实际物理宽度不一致
生成环节可控,识别环节要接受现实:Go 不是图像识别主力语言,硬啃本地识别库往往卡在 OpenCV 版本、zbar 编译或 ARM 兼容性上。优先走“Go 生成 + 外部服务识别”路径,省掉三天排错时间。

















