引入包的路径错误 package XXX is not in GOROOT

出现该错误的原因时引入包的路径错误,go在引入包时有其自己的查找方式,如下:

在 GOPATH 模式下,执行 go build 或 go run 时,在 vendor 目录、GOPATH 目录、GOROOT 目录都可能存在依赖库(标准库、第三方库等),将依次按照如下的目录过程寻找引用的依赖:

1.在当前目录下的 vendor 目录查找依赖的 package
2.当前目录不存在 vendor 目录,则去上一级目录寻找
3.重复步骤 2 直到进入 $GOPATH/src 目录
4.没有在 vendor 目录中查找到依赖包,则进入 $GOROOT 目录查找依赖包
5.$GOPATH 目录也没有依赖包,则进入 $GOROOT 目录寻找依赖包

在GOPATH目录下没有找到包,最后就会去GOROOT下查找,最终没有找到就会报错。

如下在GOPATH目录下,创建src/hello目录,在创建main.go和test.go两个源文件,内容如下:

package main

import "fmt"

import "unit4/src/hello/test"

func main()  {
	fmt.Println("Hello")

	test.PrintTest()
}
package test
import "fmt"

func PrintTest(){
	fmt.Println("test")
}

在运行时却报错了,如下:

这里违反了go包管理的原则,一个文件需要在一个独立的报下,而上面的main,test同在hello目录下,是错误的。

由于包在管理文件时,文件必须要在独立的包下,所以兴建一个test目录,将test.go源文件移动到test包下,如下:

在这里插入图片描述

重构包后在需要的文件中引入test包import "unit4/src/hello/test"。

需要注意的是,这里路径表示的意义是:项目根目录/src/包目录。最终到包目录即可。

可以看出,在到入包是只导入到了包目录,引用时也是基于包名引用的,因此源文件的名称没有作用。也就是说,test.go文件可以任意命名,因为在包管理下,其作用的主要是包名。

如下改为xxx.go后仍然可以运行:

在这里插入图片描述

 在这里插入图片描述

 

GO111MODULE 有三个值:off, on和auto(默认值)

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

 

解决方案:

方案一:关闭 go mod 模式

用 gopath 模式引入包从src目录下开始引入,需要

go env -w GO111MODULE=off

方案二:使用go mod 模式,从go1.12开始都是使用这种模式

go env -w GO111MODULE=on

并且在目录下执行 go mod init 路径名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值