Golang中如何使用Gopath外的包
Golang中如何使用Gopath外的包 大家好,
我可能遗漏了一些非常简单基础的东西,但依然没想明白问题所在。
我在Go路径外创建了一个go-mod文件夹,其中包含main.go文件和一个名为hello的文件夹,hello文件夹内包含world.go文件。
- go-mod – main.go – hello — world.go
当我尝试执行:
func main() {
hello.World()
}
程序无法找到"hello"包。导入功能也不起作用(在Go路径下导入语句import "gitlab.intra/agrechka/go-mod/hello"本应正常运作)。
执行go mod init和go mod tidy命令后问题仍未解决。
运行环境:MacOS,Go v1.11
感谢帮助!
更多关于Golang中如何使用Gopath外的包的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你好 Artem,
我刚才试了一下,这个方法对我有效。无论是将 GOPATH 设置为完全不同的目录(位于 go-mod 所在目录树之外),还是完全不设置 GOPATH,都能正常工作。我使用的是 Linux 系统上的 Go 1.11。
在文件 main.go 中:
package main
import "./hello"
func main() {
hello.World()
}
在文件 hello/world.go 中:
package hello
import "fmt"
func World() {
fmt.Printf("hello, world\n")
}
$ go run main.go
hello, world
$ go build main.go
$ ./main
hello, world
在你的情况下,问题可能源于 Go 模块未正确初始化或导入路径不匹配。Go 1.11 引入了模块支持,但需要确保模块设置正确。以下是步骤和示例代码来解决这个问题。
首先,确认你的项目结构如下:
go-mod/
├── main.go
└── hello/
└── world.go
-
初始化 Go 模块:在
go-mod目录下运行go mod init命令,指定一个模块路径。例如,如果你使用 GitLab 仓库,可以这样初始化:cd go-mod go mod init gitlab.intra/agrechka/go-mod这会创建一个
go.mod文件,定义模块路径。 -
编写包代码:在
hello/world.go文件中,定义一个包并导出函数。确保包名与导入路径一致。例如:// hello/world.go package hello import "fmt" func World() { fmt.Println("Hello, World!") }这里,包名是
hello,与目录名一致。 -
在 main.go 中导入和使用包:在
main.go中,使用模块路径导入hello包。导入路径应为模块路径加上子目录路径。例如:// main.go package main import "gitlab.intra/agrechka/go-mod/hello" func main() { hello.World() }这里,导入路径是
gitlab.intra/agrechka/go-mod/hello,对应hello目录。 -
运行 Go 工具命令:执行
go mod tidy来解析依赖并更新go.mod文件。然后运行程序:go mod tidy go run main.go如果一切正确,输出应为:
Hello, World!。
如果问题仍然存在,检查以下点:
- 确保
go.mod文件中的模块路径与导入路径匹配。例如,如果go.mod包含module gitlab.intra/agrechka/go-mod,那么导入必须是gitlab.intra/agrechka/go-mod/hello。 - 验证 Go 版本:Go 1.11 是早期模块版本,可能存在兼容性问题。考虑升级到更新版本(如 Go 1.16+),但根据你的描述,Go 1.11 应支持基本模块功能。
- 检查文件权限和路径大小写:在 MacOS 上,确保路径大小写一致,因为 Go 对导入路径大小写敏感。
如果导入路径是本地且未推送到远程仓库,Go 模块可能无法解析。在这种情况下,你可以使用 replace 指令在 go.mod 中指定本地路径,但根据你的结构,直接使用模块路径应能工作。
示例 go.mod 文件内容:
module gitlab.intra/agrechka/go-mod
go 1.11
通过以上步骤,你的程序应该能正确找到并使用 hello 包。如果错误持续,请提供具体的错误消息以便进一步诊断。


