Golang如何在不使用GOROOT的情况下导入包
Golang如何在不使用GOROOT的情况下导入包 如何在没有设置 GOROOT 的情况下导入包? 我的目录结构如下。
tempconv/
├── main.go
└── mypackage.go
我遇到了这个错误。
archlinux $ go run main.go
main.go:5:5: package tempconv is not in GOROOT (/usr/local/go/src/tempconv)
tempconv 目录位于 /home/$USER/bin/go/。
我是否必须将所有代码移动到 /usr/local/go/src/?
更多关于Golang如何在不使用GOROOT的情况下导入包的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
符合惯用做法的是将其创建为一个合适的模块;不那么符合惯用做法的是使用 GOPATH 启动一个遗留项目,这仍然需要移动你的文件,但至少是在用户可写的位置内。
在 Go 1.11 及以上版本中,可以通过 go.mod 模块机制解决此问题,无需依赖 GOROOT 或 GOPATH。以下是具体步骤:
- 在项目根目录初始化模块:
cd /home/$USER/bin/go/tempconv
go mod init tempconv
- 调整目录结构(推荐):
tempconv/
├── go.mod
├── main.go
└── mypackage/
└── mypackage.go
- 修改 mypackage.go 的包声明:
// mypackage/mypackage.go
package mypackage
func MyFunction() string {
return "Hello from mypackage"
}
- 修改 main.go 的导入方式:
// main.go
package main
import (
"fmt"
"tempconv/mypackage"
)
func main() {
fmt.Println(mypackage.MyFunction())
}
- 运行程序:
go run main.go
如果保持原有平面目录结构,可以这样配置:
// go.mod
module tempconv
go 1.21
// mypackage.go
package tempconv
func MyFunction() string {
return "Hello from tempconv"
}
// main.go
package main
import (
"fmt"
"tempconv"
)
func main() {
fmt.Println(tempconv.MyFunction())
}
关键点:
- go.mod 文件定义了模块根路径
- 导入路径基于模块名称(go.mod 中的 module 指令)
- 无需设置 GOROOT 或 GOPATH
- 支持本地开发,无需将代码放入系统目录
验证模块配置:
go list -m
go list ./...

