Go同模块本地目录导入自定义包报错问题求助
问题分析与解决
核心问题
你的代码存在两个关键问题:
- 导入路径与目录结构不匹配:你导入的是
github.com/mycompany/mycompany-go/mycompany,Go会默认在模块根目录下的mycompany子目录中寻找对应包,但你把something.go直接放在了模块根目录,没有这个子目录,所以Go找不到包。 - 库包与main包混放:模块根目录下同时存在
mycompany库包文件(something.go)和main包文件(main.go),虽然Go语法允许,但不符合Go项目规范,还会导致后续发布模块时把main代码也打包进去。
解决方案
方案一:规范目录结构(推荐)
这是stripe-go、chargebee-go这类官方库的标准结构,库代码放在对应子目录,main代码单独存放:
- 在模块根目录创建
mycompany子目录:
cd ~/Desktop/mycompany-go mkdir mycompany
- 将
something.go移动到mycompany子目录中:
mv something.go mycompany/
- (可选)把
main.go移到cmd/example这类子目录(避免和库代码混放),此时main.go的导入路径保持不变:
// cmd/example/main.go package main import ( "github.com/mycompany/mycompany-go/mycompany" ) func main() { s := mycompany.Something{ Title: "Example", } }
- 运行测试:
go run cmd/example/main.go
方案二:直接使用模块根目录作为库包
如果不想创建子目录,可调整导入路径匹配根目录的包:
- 修改
main.go的导入路径为模块本身的路径:
package main import ( "github.com/mycompany/mycompany-go" ) func main() { s := mycompany.Something{ Title: "Example", } }
- 运行测试:
go run main.go
注意:这种方式不推荐,因为发布模块时会把根目录的main.go也包含进去,不符合库项目的发布规范。
为什么原提示不正确?
Go的错误提示是基于导入路径的常规逻辑——当找不到对应路径的包时,默认建议拉取远程模块,但你的情况是本地目录结构不匹配导入路径,而非缺少远程包,所以提示不符合你的实际场景。
内容的提问来源于stack exchange,提问作者collimarco
相关产品推荐
相关产品推荐

