goland编写go语言导入自定义包出现: package xxx is not in GOROOT (/xxx/xxx) 的解决方案

问题

写了个自定义的包 calc.go,在路径 $GOPATH/go_project/src/demo_51_package/com/目录下,其中main.go 是main方法的入口

代码

main.go 代码如下
go 复制代码
package main
import "demo_51_package/com"
func main() {
	add := calc.Add(1, 2)
	println(add)
}
calc.go代码如下
go 复制代码
package calc
/**
  * 首字母大写才能别其他的包使用
  */
func Add(x int,y int)(int){
	return x + y
}

运行

当我运行时出现了以下错误

shell 复制代码
package demo_51_package is not in GOROOT (/Users/yexindong/Documents/go_root_path/go/src/demo_51_package)

看图吧,跟上面的 字一样的

这个错误告诉你项目demo_51_package不在go的根目录中,导入包名是从$GOPATH/src/后开始计算的,使用/进行路径分隔。但我看自己的导入包并没有错,这是怎么回事呢?

原因

是GOPATH的问题吗?

一开始以为是GOPATH的问题,配置了idea的GOPATH后,发现还是一样,为此就可证明不是GOPATH的问题,先瞥一眼GOPATH的配置(这个配置是正确的✅)

和go的环境变量中的GOPATH是可以对得上的,通过go env命令查看

原来是go mod的原因

通过查找资料,发现是go mod的原因,并且我电脑上的go mod默认是开启的,通过命令go env查看go的环境变量,输入命令后会打印好多行的内容,这里我们只关注以下这一行的配置,就是gomod的状态,发现是开启的

shell 复制代码
GO111MODULE="on"

那么问题来了。什么是go mod呢?

go mod 是什么

Go.mod是Golang1.11版本新引入的官方包管理工具用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理,可以理解为java中的maven;谈到maven就熟悉了,其实就是依赖管理的工具嘛,可以用来控制依赖的版本;

最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面,下载的依赖包也没有版本概念,这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖无法依赖同一个第三方的库的不同版本,并且,代码开发必须在go path src目录下。这在实际开发中造成许多的问题。

解决方案

方案一:关闭go mod

这个方案非常简单,只需要在命令行输入以下命令即可

复制代码
go env -w GO111MODULE=off

方案二:将项目转为module(模块)

进入项目目录demo_51_package下,输入以下2个命令

复制代码
# 初始化模块-- init 后面的名称一定要和项目目录相同
go mod init demo_51_package

# 下载依赖包
go mod tidy

执行后会发现,项目下多了个go.mod的文件

这个文件内容也非常简单,只有2行数据

复制代码
module demo_51_package

go 1.17

在次运行

配置完成后,在编译并执行main方法,发现已经可以正常运行了

相关推荐
忆~遂愿几秒前
Runtime 上下文管理:计算实例的生命周期、延迟最小化与上下文切换优化
java·大数据·开发语言·人工智能·docker
沐知全栈开发1 分钟前
PostgreSQL中的AND和OR操作符
开发语言
1尢晞16 分钟前
Java学习
java·开发语言
毕设源码-赖学姐15 分钟前
【开题答辩全过程】以 基于python的电影推荐系统为例,包含答辩的问题和答案
开发语言·python
qq_2975746717 分钟前
【实战】POI 实现 Excel 多级表头导出(含合并单元格完整方案)
java·spring boot·后端·excel
星辰_mya20 分钟前
Elasticsearch线上问题之慢查询
java·开发语言·jvm
前端小菜袅23 分钟前
PC端原样显示移动端页面方案
开发语言·前端·javascript·postcss·px-to-viewport·移动端适配pc端
Highcharts.js24 分钟前
如何使用Highcharts SVG渲染器?
开发语言·javascript·python·svg·highcharts·渲染器
郝学胜-神的一滴29 分钟前
超越Spring的Summer(一): PackageScanner 类实现原理详解
java·服务器·开发语言·后端·spring·软件构建
摇滚侠30 分钟前
Java,举例说明,函数式接口,函数式接口实现类,通过匿名内部类实现函数式接口,通过 Lambda 表达式实现函数式接口,演变的过程
java·开发语言·python