Go语言GOPATH是什么

news2025/1/16 19:02:44

一、GOPATH的概念

       GOPATH 是 Go 语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录(也称为工作区), 是存放 Golang 项目代码的文件路径, GOPATH 适合处理大量 Go语言源码、多个包组合而成的复杂工程。

        工作目录是一个工程开发的相对参考目录,好比当你要在公司编写一套服务器代码,你的工位所包含的桌面、计算机及椅子就是你的工作区。

        工作区的概念与工作目录的概念也是类似的。如果不使用工作目录的概念,在多人开发时,每个人有一套自己的目录结构,读取配置文件的位置不统一,

二、GOPATH的使用 

GOPATH目录一般为:

1、bin 存放编译生成的二进制文件。比如 执行命令 go get github.com/google/gops,bin目录会生成 gops 的二进制文件。

2、pkg 其中pkg下面以下三个文件夹。

  •  XX_amd64: 其中 XX 是目标操作系统,比如 mac 系统对应的是darwin_amd64, linux 系统对应的是 linux_amd64,存放的是.a结尾的文件。
  •  mod: 当开启go Modules 模式下,go get命令缓存下依赖包存放的位置
  •  sumdb: go get命令缓存下载的checksum数据存放的位

3、src 存放golang项目代码的位置

image-20220409140546638 

 如下是一个完整的Go项目的开发目录:

my-go                 // my-go为GOPATH目录
  -- bin
     -- myApp1        // 编译生成
     -- myApp2        // 编译生成
     -- myApp3        // 编译生成
  -- pkg                             依赖包编译后的*.a文件//
  -- src
     -- MyApp1        // 项目1
        -- models
        -- controllers
        -- others
        -- main.go 
     -- MyApp2        // 项目2
        -- models
        -- controllers
        -- others
        -- main.go

三、造成问题

        在使用 GOPATH 模式下,我们需要将应用代码存放在固定的$GOPATH/src目录下,且如果执行go get使用第三方类库的时候会自动下载并安装到$GOPATH目录下。 项目的Golang代码,和第三方的Golang文件混在一起, 每个如果项目都需要同样的依赖,那么我们就会在不同的GoPath的src中下载大量重复的第三方依赖包,这同样会占用大量的磁盘空间

GOPATH 的缺点

  1. 必须指定目录,
  2. go get 命令的时候,无法指定获取的版本
  3. 引用第三方项目的时候,无法处理v1、v2、v3等不同版本的引用问题,因为在GOPATH 模式下项目路径都是 github.com/foo/project
  4. 无法同步一致第三方版本号,在运行 Go 应用程序的时候,无法保证其它人与所期望依赖的第三方库是相同的版本。

我们给不同的项目设置不同的GoPath,优点非常明显:

        便于管理项目,每个项目都是不同的GoPath,这对于我们管理多个Golang项目而言,能够非常清晰的处理项目结构。如果我们把所有项目都放在同一个GoPath的src包下,那么项目的结构就会变得非常混乱,难以管理。

但是当我们需要依赖第三方的包的时候,不同的项目设置不同的GoPath的缺点也非常明显:

  1. 第三方依赖的包和我们自己的Golang包混在一起,会给我们的项目文件管理带来一定的麻烦。
  2. 不同的GoPath都需要下载依赖,那么磁盘中重复的依赖就会非常多,会占用我们大量的磁盘空间。

所以,设置一个GoPath目录,解决依赖重复的问题,设置不同的GoPath目录,解决Golang项目结构混乱的问题,这本身就是个有争议性的问题。

为了解决这所有的问题,Golang最终引入了GoModule的概念。

 

四、参考

一文搞懂GOPATH 与 GO Modules 

Golang中的GoPath和GoModule

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/93809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】特征独立性检验-特征太多删特征-删who呢

总结 MvTest独立性分析方法——检验数值型特征与label是否有关系,删除与label无关(独立)的特征;corr协方差函数 相关性分析——找到数值型特征与数值型特征之间相关性高的数值型特征,然后删除(相关性高的数…

Xcode 导入共享代码文件却提示找不到其中方法或类型的原因与解决

文章目录 问题现象问题分析1. 原景重现2. 为什么找不到共享代码文件中的方法?3. 解决之道总结结束语问题现象 正所谓“一个好汉三个帮,一块篱笆三个桩”,开发一款优秀的 App 也绝对少不了第三方高质量代码的加持。 但有时候,我们明明已在 Xcode 中导入了第三方共享代码文…

微服务框架 SpringCloud微服务架构 多级缓存 46 JVM 进程缓存 46.3 初识Caffeine

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存46 JVM 进程缓存46.3 初识Caffeine46.3.1 本地进程缓存46.3.2 Caffeine 示例46 JVM 进程缓存 46.3 初…

openGemini v0.2.0版本正式发布:5大特性全面增强

摘要:openGemini是华为云面向物联网和运维监控场景开源的一款云原生分布式时序数据库,兼容InfluxDB API,具有高性能、高并发、高扩展等特点。openGemini是华为云面向物联网和运维监控场景开源的一款云原生分布式时序数据库,兼容In…

Docker redis Connection refused 问题排查

问题描述: 用 docker分别运行2个容器,一个spring boot应用,一个是redis 然后发现Spring boot项目无法访问redis。在本地启动Spring boot项目可以访问Redis,然后打成JAR直接启动也能访问。但是做成容器访问Redis却总是报错。 2022-12-16 06:…

RK3588 调试 phy

参考:Rockchip_Developer_Guide_Linux_GMAC_CN Rockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN GMAC 接口电路 RK3588 芯片拥有 2 个 GMAC 控制器,提供 RMII 或 RGMII 接口连接外置的 Ethernet PHY GMAC 控制器支持以下功能: …

LSTM前向传播代码实现——LSTM从零实现系列(3)

一、前言 这个LSTM系列是在学习时间序列预测过程中的一些学习笔记,包含理论分析和源码实现两部分。本质属于进阶内容,因此神经网络的基础内容不做过多讲解,想学习基础,可看之前的神经网络入门系列文章: https://blog.…

全自动化数据洞察!数据分布对比可视化!

💡 作者:韩信子ShowMeAI 📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40 📘 本文地址:https://www.showmeai.tech/article-detail/411 📢 声明:版权所有,转…

几种数据库jar包获取方式

摘要:以下提供的都是各个数据库较为官方的jar包获取方式。本文分享自华为云社区《JDBC连接相关jar包获取及上传管理中心白名单处理》,作者:HuaWei XYe。 jar包获取 以下提供的都是各个数据库较为官方的jar包获取方式 1、Mysql https://de…

C#启程—游戏开发笔记

文章目录ideRider下载和安装创建C#基础工程(包含form)Rider去除语法警告C#笔记namespace找不到某个class(命名空间)c#相对路径(比较特别)双缓存技术窗体事件绑定窗体初始属性方法生成调式绑定事件成功窗体中…

再探Vue3响应式系统

欲看懂这一篇还是建议先看上一篇,这一篇我们继续往下走 一、嵌套问题 🖖先看背景 在这段代码里面,question1里面嵌套了question2,所以question1的执行会导致question2的执行 let temp1 ,temp2; function question1() {console.…

基于java+springmvc+mybatis+vue+mysql的电子资源管理系统

项目介绍 随着互联网技术的高速发展,人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门就可以通过网络进行系统管理,交易等,而且过程简单、快捷。同样的,在人们的工作生活中,也就…

AI加速自动驾驶进程,景联文科技提供数据采集标注服务

“当前,路面上搭载各级别自动驾驶系统的车辆数量逐渐增多。对自动驾驶领域头部企业来说,为了保持自身的竞争优势并加速自动驾驶应用安全落地进程,需要依靠大量的高质量标注数据来训练优化自动驾驶相关算法模型。数据作为AI技术的底层基础&…

备战2023蓝桥国赛-饼干

题目描述: 解析: 这道题我想了很多种解决方法,但无一例外都失败了,实在是按照常规线性DP的思路真的想不出来。 看了题解之后才知道它是分为三步解决这个问题的: 第一步:缩小最优解的范围 先用贪心将最优解…

如何准备好2023年的USACO?

目录 1. 注册 2. 刷题 3. 备考 4. 考试流程/介绍 5. 铜组例题 1. 注册 先进入usaco的官网,主页的右边会有注册的选项,点击Register for New Account。会让你填你自己的用户名,邮箱,实名,毕业的年份,还…

世界杯数据分析

国际足联世界杯(FIFA World Cup) 文章目录前言一、历届世界杯数据分析(一)建表(二)导入数据(三)数据分析1. 全勤巴西2. 夺冠排名3. 扩军历史4. 进球之最二、本届世界杯数据分析&…

【Java寒假打卡】Java基础-数据类型以及转换

【Java寒假打卡】Java基础-数据类型以及转换一、关键字二、强制转换三、常量四、隐式转换的问题五、变量六、程序输入七、标识符八、类型转换一、关键字 含义:java 中被赋予特定含义和特点的单词 二、强制转换 数据范围大变量赋给一个数据范围小的变量int 到byte…

android绘制弧形背景

先看一下效果&#xff1a; 在drawable中写shape.xml文件 <?xml version"1.0" encoding"utf-8"?> <layer-list xmlns:android"http://schemas.android.com/apk/res/android"><item><shape><solid android:color&quo…

Hadoop学习----Hadoop介绍

Hadoop介绍 Hadoop是Apache软件基金会的一款开源软件。底层是由java语言实现。 功能&#xff1a;允许用户使用简单的编程模型实现跨机器集群对海量数据进行分布式计算处理。 Hadoop核心组件&#xff1a; Hadoop HDFS&#xff08;分布式文件存储系统&#xff09;&#xff1a;解…

大道至简——工具类产品的几个思考方向

因为之前没有接触过摹客的产品&#xff0c;对于一个经常使用Axure的产品经理&#xff0c;仅仅通过两周摹客的使用体验写出的体验文档确实不够严谨&#xff0c;所以以下除了表层的几点用户体验&#xff0c;重点还是谈一下对工具类产品发展方向的思考。 体验篇 一款产品的诞生肯…