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

本文主要是介绍【go】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 代码如下

package main
import "demo_51_package/com"
func main() {add := calc.Add(1, 2)println(add)
}

calc.go代码如下

package calc
/*** 首字母大写才能别其他的包使用*/
func Add(x int,y int)(int){return x + y
}

运行

当我运行时出现了以下错误(直接点绿色箭头,执行go build)

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/后开始计算的,使用/进行路径分隔。但我看自己的导入包并没有错,这是怎么回事呢?

如果直接go run xxx.go 报错如下

 go run demo01.go 
demo01.go:5:2: cannot find module providing package github.com/gin-gonic/gin: working directory is not part of a module

可以看到这里是因为没有识别成一个module,与go module有关系

原因

是GOPATH的问题吗?

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

在这里插入图片描述

和go的环境变量中的GOPATH是可以对得上的,通过go env命令查看
在这里插入图片描述

原来是go mod的原因

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

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_packagego 1.17

在次运行
配置完成后,在编译并执行main方法,发现已经可以正常运行了
在这里插入图片描述

参考链接
https://blog.csdn.net/qq_27184497/article/details/122160400?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.pc_relevant_aa&spm=1001.2101.3001.4242.1&utm_relevant_index=3

这篇关于【go】goland编写go语言导入自定义包出现: package xxx is not in GOROOT (/xxx/xxx) 的解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010652

相关文章

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

kkFileView在线预览office的常见问题以及解决方案

《kkFileView在线预览office的常见问题以及解决方案》kkFileView在线预览Office常见问题包括base64编码配置、Office组件安装、乱码处理及水印添加,解决方案涉及版本适... 目录kkFileView在线预览office的常见问题1.base642.提示找不到OFFICE组件

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到