Golang中Module和Packages的使用问题
Golang中Module和Packages的使用问题 大家好,
我是Go语言的新手,有一个关于包的问题。我的目录结构如下:

我试图将两个不同的包导入到 main.go 中。与 main.go 在同一个模块中的 package1 导入成功了。然而,numbers 包是一个外部包,导入失败了(当运行 main.go 时)。我的 main.go 如下:
package main
import (
"master_go_programming/application_structure/package1"
"mypackages/numbers"
)
func main() {
package1.SayHello()
numbers.AddConsecutiveNums(5)
}
当我运行 main.go 时:
$ go run main.go
main.go:5:2: package mypackages/numbers is not in GOROOT (/usr/lib/go-1.18/src/mypackages/numbers)
有没有办法在不更改 GOPATH 的情况下解决这个问题?我倾向于使用 GO111MODULE=on,但似乎无法让它正常工作。
更多关于Golang中Module和Packages的使用问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
这很有帮助!感谢您的解释!
更多关于Golang中Module和Packages的使用问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我通过在 go.mod 文件中添加以下内容解决了这个问题:
require "mypackages/numbers" v0.0.0
replace "mypackages/numbers" => "../../mypackages/numbers"
在Go模块中,导入外部包需要确保该包在go.mod文件中被正确声明。根据你的错误信息,mypackages/numbers没有被Go工具链找到,因为它既不在标准库中,也不在当前模块的依赖项中。
首先,检查你的项目根目录下是否有go.mod文件。如果没有,可以通过以下命令初始化模块:
go mod init master_go_programming
如果numbers是一个本地包(位于项目目录外但仍在本地文件系统中),你需要将其作为依赖项添加到go.mod中。假设numbers包位于/path/to/mypackages/numbers,你可以使用replace指令:
// go.mod
module master_go_programming
go 1.18
replace mypackages/numbers => /path/to/mypackages/numbers
require mypackages/numbers v0.0.0
然后运行go mod tidy来同步依赖。
如果numbers是一个远程仓库中的包(例如GitHub),直接导入其完整路径即可。例如,如果包位于github.com/user/mypackages/numbers,则修改导入语句:
import (
"master_go_programming/application_structure/package1"
"github.com/user/mypackages/numbers"
)
运行go mod tidy会自动下载并添加依赖到go.mod。
如果numbers是本地开发中的另一个模块,且你希望保持其独立性,可以将其发布到版本控制系统,或使用本地模块代理。对于本地开发,也可以使用go work(Go 1.18+)来管理多个模块。首先在工作区目录初始化工作区:
go work init ./master_go_programming ./mypackages/numbers
然后在工作区根目录运行go run master_go_programming/main.go。
确保你的环境变量GO111MODULE设置为on:
export GO111MODULE=on
或者直接通过命令行设置:
GO111MODULE=on go run main.go
示例代码结构如下:
project/
├── go.mod
├── go.sum
├── main.go
└── application_structure/
└── package1/
└── package1.go
go.mod内容示例:
module master_go_programming
go 1.18
require (
github.com/user/mypackages/numbers v1.2.3
)
运行前执行:
go mod tidy
go run main.go
这样应该能解决导入问题。


