qrcode库是Go生态最成熟无依赖的UTF-8二维码生成方案,支持四档纠错、自动拉高至256×256、一行WriteFile输出PNG;SVG需手动渲染Grid;命令行推荐pflag校验参数。

用 qrcode 库生成标准二维码最省事
Go 生态里最成熟、无依赖、支持 UTF-8 的二维码生成库是 qrcode(作者:sqweek),不是 go-qrcode 或其他同名变体。它默认输出 PNG,不带任何 HTTP 服务或 CLI 封装,正适合做轻量工具底座。
安装只需:
go get github.com/sqweek/qrcode
-
qrcode.WriteFile()一行写 PNG,支持qrcode.Low~qrcode.High四级纠错 - 中文内容直接传入
string即可,内部用 UTF-8 编码,无需手动转 GBK 或 Base64 - 尺寸单位是像素,不是“模块数”;最小输出为 256×256,低于该值会被自动拉高(避免过小无法识别)
- 若要生成 SVG,得自己调
qrcode.Encode()拿到*qrcode.QRCode,再遍历QRCode.Grid手动渲染——没内置 SVG 导出
命令行工具里怎么接收参数并生成文件
别用 flag 手动解析长参数,直接上 github.com/spf13/pflag(兼容 flag 且支持 --help 自动格式),配合 os.Args 前置校验更稳妥。
- 必须检查
len(os.Args) ,否则 <code>os.Args[1]panic:索引越界比空输入更早触发 - 输出路径建议用
-o参数,默认后缀强制为.png,避免用户输qr.jpg还真去写 JPEG(qrcode库只支持 PNG) - 尺寸参数如
-s 300要做范围限制(比如 128–1024),否则传负数或超大值会导致内存暴涨或图像失真 - 纠错等级用字符串映射:
map[string]qrcode.RecoveryLevel{"L": qrcode.Low, "M": qrcode.Medium, ...},别硬写 switch
生成的二维码扫不出来?先查这三处
90% 的“扫不出”问题和算法无关,纯属 I/O 或编码陷阱。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
立即学习“go语言免费学习笔记(深入)”;
- 文件写入后没调
defer f.Close()或f.Sync(),尤其在容器或 CI 环境下,进程退出快于磁盘刷写,导致生成空文件 - 输入字符串末尾有不可见字符(比如 shell 中复制带换行的 URL、Windows 下的
\r\n),用strings.TrimSpace()预处理 - HTTP 场景下返回 PNG 时,忘了设
Content-Type: image/png,浏览器当文本渲染,显示乱码而非图像 - Web 工具中用
base64内联显示时,别漏掉data:image/png;base64,前缀——少一个逗号就变成纯文本
想嵌入 Logo?得手动合成,库不提供
qrcode 库本身不支持 logo 覆盖,必须用图像处理库二次加工。推荐 golang.org/x/image/draw + image/png,别引入 heavy 的 imaging 或 gift。
- 先用
qrcode.WriteFile()生成原图,再png.Decode()读回*image.NRGBA - Logo 图片建议预缩放到二维码尺寸的 1/4~1/5,中心对齐;过大易遮挡关键定位点(左上、右上、左下三个方块)
- 合成时用
draw.Over模式,不是draw.Src,否则覆盖区域会丢失底层二维码信息 - 注意 Alpha 通道:PNG logo 若带透明度,
draw.Over能正确混合;但若 logo 是 JPEG,需先转成 RGBA 并填充背景色,否则中心出现白块
Logo 嵌入这事看着简单,实际调试耗时远超生成逻辑本身——定位点被盖住、边缘锯齿、深色 logo 在黑模块上不可见,都是现场才暴露的问题。

















