Golang中Module和Packages的使用问题

Golang中Module和Packages的使用问题 大家好,

我是Go语言的新手,有一个关于包的问题。我的目录结构如下:

image

我试图将两个不同的包导入到 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

4 回复

这很有帮助!感谢您的解释!

更多关于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.mod 的正确解决方案。

Go 1.18+ 甚至提供了工作区(通过 go.work 文件),这有助于将本地替换排除在您的仓库之外。

以及一些额外的背景信息:

  • 使用 Go Modules 时,GOPATH 仅管理模块缓存和构建产物的位置。GOPATH 与定义源代码位置无关。
  • 最新的 Go 版本默认启用了 GO111MODULE。因此不再需要使用该环境变量。
  • 通常,您在 go.mod 中设置的模块路径指向一个远程仓库,go getgo mod download 及类似命令可以从那里获取模块。对于纯本地开发,您可以忽略此规则,但如果您打算发布一个模块,请考虑从一开始就使用最终的(远程)模块路径。
func main() {
    fmt.Println("hello world")
}

在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

这样应该能解决导入问题。

回到顶部