本篇文章已有104人收藏 | Loading收藏
在学习golang的过程中遇到了“package xx is not in GOROOT”的报错,记录下解决问题的方法。

区分路径

Golang在安装时有两个非常重要的环境变量(路径):

  • GOROOTGolang的安装路径,安装默认设置
  • GOPATHGolang的项目目录,需手动指定

go_project // (go_project为 GOPATH目录)

– bin // golang编译可执行文件存放路径

– pkg // golang编译包时,生成的.a文件存放路径

– src // 源码路径。按照golang默认约定,go run,go install等命令的当前工作路径

报错分析

导包时编译器不检索GOPATH路径,导致包管理出现问题。

golang 1.11版本及以后的不在建议使用GOPATH,推荐使用go mod——GO111MODULE,go modules 是1.11版本的新加特性。

模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。

GO111MODULE

GO111MODULE 有三个值:off, on和auto;默认设置为空

  • GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
  • GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。依赖包的存放位置变更为$GOPATH/pkg,允许同一个package多个版本并存,且多个项目可以共享缓存的 module
  • GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:⑴当前目录在 GOPATH/src 之外且该目录包含go.mod文件;⑵当前文件在包含go.mod文件的目录下面。

解决方案

命令行使用go env查看环境,默认GO11MODULE是没有设定的。
[技术·笔记] golang导入模块报错package xx is not in GOROOT插图1

方案一:go mod 模式设置为auto

go env -w GO111MODULE=auto

方案二:go mod 模式设置为on

go env -w GO111MODULE=on

// 并在项目目录下执行
go mod init

// 初始化包管理并产生以下两个文件
// go.mod
// go.sum
// 这两个文件注意不要删掉了,否则就会报错找不到包
我是格雷万事屋屋主,欢迎来到万事屋ヾ(≧▽≦*)o
最后更新于 2022-12-27