Go run/build执行无响应挂起问题求助(含sqlite3导入场景)
Go编译导入sqlite3包时无响应,陷入循环
我编写了如下简单的main.go文件:
package main import ( "fmt" "database/sql" _ "github.com/mattn/go-sqlite3" ) func main() { db, err := sql.Open("sqlite3", "mydb.db") if err != nil { panic(err) } defer db.Close() fmt.Println("Opened Successfully") }
已下载所需依赖包,但执行go run .或go build .时,编译器无响应,陷入类似无限循环的状态。移除_ "github.com/mattn/go-sqlite3"导入语句后,程序会正常抛出错误:panic: sql: unknown driver "sqlite3" (forgotten import?)。该问题在导入部分其他包时也会出现。
我的go.mod文件内容如下:
module go-sqlite go 1.18 require github.com/mattn/go-sqlite3 v1.14.15
Go版本信息:go version go1.18.1 linux/amd64
解决办法
1. 检查并安装C编译环境
github.com/mattn/go-sqlite3是基于cgo的绑定包,编译必须依赖C编译器(如gcc)。如果系统没装gcc,就会导致编译卡住:
- Debian/Ubuntu系统:执行
sudo apt install gcc - CentOS/RHEL系统:执行
sudo yum install gcc
安装完成后重新编译试试。
2. 尝试禁用cgo(仅作排查用)
如果不想依赖C环境,可以临时禁用cgo验证问题根源,但注意这个驱动本身依赖cgo,禁用后大概率无法正常运行:
执行CGO_ENABLED=0 go run .,如果报错说明必须依赖C环境,回到方案1即可。
3. 更新依赖或Go版本
当前Go版本1.18.1和sqlite3包v1.14.15可能存在兼容性问题:
- 更新sqlite3包:
go get github.com/mattn/go-sqlite3@latest - 升级Go到较新的稳定版(比如1.21+),新版本对cgo编译和依赖管理有优化。
4. 清理模块缓存
缓存的依赖包损坏也可能导致编译异常:
先执行go clean -modcache清理缓存,再运行go mod tidy重新拉取依赖,之后再尝试编译。
5. 检查系统资源
编译卡住时用top或htop看CPU、内存占用:
- 如果go或gcc进程占用极高,可能是首次编译cgo包需要较长时间,多等一会儿;
- 如果资源占用极低却一直卡住,说明环境有问题,参考前面的方案排查。
内容的提问来源于stack exchange,提问作者Ibrahim Sharaf
相关产品推荐
相关产品推荐

