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 回复

谢谢。

更多关于Golang如何在不使用GOROOT的情况下导入包的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


符合惯用做法的是将其创建为一个合适的模块;不那么符合惯用做法的是使用 GOPATH 启动一个遗留项目,这仍然需要移动你的文件,但至少是在用户可写的位置内。

在 Go 1.11 及以上版本中,可以通过 go.mod 模块机制解决此问题,无需依赖 GOROOT 或 GOPATH。以下是具体步骤:

  1. 在项目根目录初始化模块:
cd /home/$USER/bin/go/tempconv
go mod init tempconv
  1. 调整目录结构(推荐):
tempconv/
├── go.mod
├── main.go
└── mypackage/
    └── mypackage.go
  1. 修改 mypackage.go 的包声明:
// mypackage/mypackage.go
package mypackage

func MyFunction() string {
    return "Hello from mypackage"
}
  1. 修改 main.go 的导入方式:
// main.go
package main

import (
    "fmt"
    "tempconv/mypackage"
)

func main() {
    fmt.Println(mypackage.MyFunction())
}
  1. 运行程序:
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 ./...
回到顶部