根本原因是Go模块模式下go get不自动写入go.mod,必须先go mod init、再go get后执行go mod tidy;若import路径未注册、GO111MODULE未开启或驱动未正确导入(如gokb需gitee地址+下划线导入),均导致包找不到。

为什么 go get 失败或包找不到
不是网络卡顿或代理没配——根本原因是 Go 模块模式下,go get 不再默认写入 $GOPATH/src,而是把依赖下载到 $GOPATH/pkg/mod 并通过 go.mod 锁定版本。常见报错如 cannot find module providing package xxx,基本都源于三件事没做:
• 当前目录没有 go.mod(执行 go mod init myproject 生成)
• 用了旧式 import "github.com/user/repo" 但该路径没在 go.sum 中注册(go get 后要手动 go mod tidy)
• 第三方库要求特定 Go 版本或启用 cgo,而本地环境未满足(比如金仓驱动 gokb 要求 GO111MODULE=on,且不能含 // #cgo)
gokb 这类国产数据库驱动怎么装才不报错
金仓官方 gokb 驱动是纯 Go 实现,不依赖 cgo,但必须用模块方式加载:
• 先确保 GO111MODULE=on(go env -w GO111MODULE=on)
• 执行 go get gitee.com/kingbase/gokb(注意是 gitee.com,不是 GitHub)
• 如果提示 unknown revision,说明仓库未公开或需鉴权——此时应从金仓官网下载源码 ZIP,解压后用 go mod edit -replace gitee.com/kingbase/gokb=./local/gokb 替换路径
• 导入时用 import _ "gitee.com/kingbase/gokb"(下划线触发驱动注册),再调 sql.Open("kingbase", connStr)
想用 pgx 连 KWDB 却提示 driver: unknown driver "postgres" for sql.Open
这是典型的驱动未注册错误,pgx 不像 database/sql 原生支持自动注册,必须显式导入驱动包:
• 正确导入方式: import "github.com/jackc/pgx/v5/pgxpool"(不是 pgx/v5 主包)
• 初始化连接必须用 pgxpool.New 或 pgx.Connect,不能走 sql.Open
• 若坚持用 database/sql 接口,得加一层适配器:import "github.com/jackc/pgx/v5/pgxpool" + import "github.com/jackc/pgx/v5/database/sql",然后 sql.Open("pgx", connStr)
• KWDB 的连接字符串必须用 postgresql:// 前缀,且端口、用户名、密码需严格匹配服务端配置(例如 26257 是默认端口,非 5432)
Colly 是一个用于 Go 语言的快速开源爬取和爬虫框架。它适用于从简单的页面提取到异步爬虫处理大量页面集合,支持请求回调和结构化解析。
静态链接第三方库(如 .so)时 C.dlopen 找不到符号
Go 本身不提供原生 dlopen,必须靠 cgo 封装 C 接口,但容易因 ABI 不一致失败:
• 头文件声明必须完整:顶部写 // #cgo LDFLAGS: -ldl 和 // #include <dlfcn.h></dlfcn.h>
• 加载路径要用绝对路径(/usr/lib/libxxx.so),相对路径 ./libxxx.so 在不同工作目录下会失效
• C.dlsym 返回的是 unsafe.Pointer,需强制转为函数类型,例如:add := *(*func(int, int) int)(C.dlsym(handle, C.CString("add")))
• 最关键:所有传入 C 函数的字符串必须用 C.CString 分配,且调用方负责 C.free;Go 的 string 或 []byte 直接传会 panic
立即学习“go语言免费学习笔记(深入)”;
跨平台动态库加载这事,本质是 ABI 层面的事——Go 的plugin 包只在 Linux/macOS 同版本同构建参数下勉强可用,Windows 直接缺席;真正能落地的方案,要么用 buildmode=c-shared 让 Go 被别人调,要么用 cgo + dlopen 让 Go 去调别人,选哪条路取决于你控制的是宿主还是插件。

















