当前位置: 首页 > news >正文

GO环境变量中GO111MODULE到底是干啥的?

  • 查看GO111MODULE变量
  • GO111MODULE的作用
  • GO111MODULE的案例演示

一,查看GO111MODULE变量

]# go env GO111MODULE
或者
]# go env | grep GO111MODULE

在这里插入图片描述

二,GO111MODULE的作用

  • auto : 自动判断机制
    当项目位于 $GOPATH/src 目录外且包含 go.mod 文件时,自动启用模块支持;若项目在 $GOPATH/src 内,则禁用模块支持,沿用传统的 GOPATH 机制
  • on : 强制启用模块支持
    依赖管理通过 go.mod 文件进行版本控制
    依赖包会被下载到 $GOPATH/pkg/mod 目录下
    构建过程不依赖 GOPATH 环境变量
  • off: 强制禁用模块支持
    依赖包需要手动 go get 到 $GOPATH/src 下
    项目导入路径必须匹配 $GOPATH/src 下的目录结构
    所有依赖必须存在于 GOPATH 中

三、GO111MODULE 使用示例

首先我们配置强制开启
window配置方式:
       go env -w GO111MODULE=on
Linux配置方式:
       echo “go env -w GO111MODULE=off” >> ~/.bashrc
       执行 source ~/.bashrc 使配置生效
验证一下是否修改成功
可以看到变量已经成功设置成off的状态 并且我们的GOPATH=/root/go
在这里插入图片描述
这也就意味着我们的package包只会在/root/go/src目录下寻找

下面是我的目录结构
[root@VM-0-3-centos go]# tree src/
src/
├── maindir
│   └── main.go
└── salary└── person└── person.go
 代码我贴在下面]# cat /root/go/src/salary/person/person.go
package person
import ("fmt"
)
type person struct {Name stringage  int sal  float64
}func NewPersion(name string, age int, sal float64) *person {return &person{Name : name,age: age,sal: sal,}
}func (p *person) SetAge(age int){if age >0 && age < 150 {p.age = age}else{fmt.Println("++++不合理++++")}
}
func (p *person) GetAge() int {fmt.Println(p.age)return p.age}func (p *person) SetSal(sal float64) {if sal >= 3000 && sal <= 30000 {p.sal = sal}else{fmt.Println("++++++++salary out of range+++++")}
}
func (p *person) GetSal() float64 {fmt.Println(p.sal)return p.sal
}
]# cat /root/go/src/maindir/main.go
package main
import ("fmt""salary/person"
)func main() {fmt.Println("Starting the main program...")p := person.NewPersion("TOM",21,3000.15)p.GetAge()p.GetSal()p.SetAge(55)p.SetSal(30000)p.GetAge()p.GetSal()
}

下面我们来执行下

package main
import ("fmt""salary/person"
)func main() {fmt.Println("Starting the main program...")p := person.NewPersion("TOM",21,3000.15)p.GetAge()p.GetSal()p.SetAge(55)p.SetSal(30000)p.GetAge()p.GetSal()
}

在这里插入图片描述
可以看到执行成功了
同样的,我在/data/MYPROJECT/目录下有一份结构一样的代码。如下图所示

[root@VM-0-3-centos data]# tree MYPROJECT/
MYPROJECT/
├── maindir
│   └── main.go
└── salary└── person└── person.go
代码是和上边一模一样的,我就不粘贴了,下面我们运行一下试试效果,不过我需要删掉/root/go/src/目录下的person包

在这里插入图片描述

可以看到,他并没有在GOROOT或者GOPATH中找到对应的person package.

那么这个时候,我们打开GO111MODULE=on
[root@VM-0-3-centos maindir]# sed -i 's@GO111MODULE=off@GO111MODULE=on@g' ~/.bashrc 
[root@VM-0-3-centos maindir]# cat ~/.bashrc | tail -1
go env -w GO111MODULE=on
[root@VM-0-3-centos maindir]# source ~/.bashrc
[root@VM-0-3-centos maindir]# go env GO111MODULE
on
可以看到目前GO111MODULE是开启状态
这个时候我们需要go mod init PROJECT让他识别到当前项目,不是必须从GOPATH路径寻找package
[root@VM-0-3-centos MYPROJECT]# go mod init MYPROJECT
go: creating new go.mod: module MYPROJECT
go: to add module requirements and sums:go mod tidy
[root@VM-0-3-centos MYPROJECT]# go mod tidy

在这里插入图片描述

可以看到生成了一个go.mod文件
在这里插入图片描述
这个时候我们需要稍微修改一下main.go. 因为我们初始化的项目根目录是MYPROJECT.
在这里插入图片描述
修改成如下import 路径
在这里插入图片描述

下面让我们运行一下
[root@VM-0-3-centos maindir]# go env GO111MODULE
on
[root@VM-0-3-centos maindir]# pwd
/data/MYPROJECT/maindir
[root@VM-0-3-centos maindir]# go run main.go 
21
3000.15
55
30000

在这里插入图片描述

可以看到运行成功了,利用go mod 可以成功的摆脱了GOPATH的限制.

http://www.lryc.cn/news/626592.html

相关文章:

  • 心路历程-了解网络相关知识
  • 【论文阅读】Multi-metrics adaptively identifies backdoors in Federated Learning
  • Azure 使用记录
  • mapbox高阶,结合threejs(threebox)添加建筑glb模型,添加阴影效果,设置阴影颜色和透明度
  • 通过try-catch判断数据库唯一键字段是否重复
  • linux的内核符号表
  • 【表的操作】
  • 深入理解 Linux 多线程
  • mysql-8.0.37-linux-glibc2.12-x86_64安装
  • 可实现三重空间感知:Ai2 开源具身机器人 AI 模型 MolmoAct
  • 从防抖节流到链表树:编程世界中的抽象优化艺术
  • 23种设计模式——模板方法模式(Template Method Pattern)详解
  • 在一台没联网的机器上,用ollama加载qwen3,14b
  • 遥感机器学习入门实战教程|Sklearn 案例④ :多分类器对比(SVM / RF / kNN / Logistic...)
  • 使用 GraalVM Native Image 将 Spring Boot 应用编译为跨平台原生镜像:完整指南
  • Spring Boot 配置
  • nvidia最新论文:小型语言模型是代理人工智能的未来
  • (5)软件包管理器 yum | Vim 编辑器 | Vim 文本批量化操作 | 配置 Vim
  • 5G-A赋能AR眼镜:毫米级虚实融合的未来已来
  • 开源 AR 眼镜怎么选?OpenGlass ,OSSG,cheApR 分析推荐
  • 给你的Unity编辑器添加实现类似 Odin 的 条件显示字段 (ShowIf/HideIf) 功能
  • 用好 Elasticsearch Ruby 传输层elastic-transport
  • 二维码跳转支付宝、微信小程序二码合一(直接关联、中间页识别跳转)方案
  • python-使用鼠标对图片进行涂抹自定义绘图
  • 自己微调的大模型如何用ollama运行
  • Android 开发问题:android:marginTop=“20px“ 属性不生效
  • 数字化图书管理系统设计实践(java)
  • Redis 复制功能是如何工作的
  • Linux I/O 多路复用实战:Select/Poll 编程指南
  • iOS 应用上架常见问题与解决方案,多工具组合的实战经验