如何理解GOPATH and GOROOT?


createdtime 20211020

updatedtime 20211021

author venki.chen


一、是什么
1. 定义,是做什么用的?
  • GOROOT:是go的安装目录,如果安装了多版本的go,使用go的各种命令go buildgo install时,会通过GOROOT找到正确的路径。当我们 import内置包的时候,并不需要额外安装,当程序运行时,会先去GOROOT下找相应的包来运行。
  • GOPATH:GOPATH是Go语言中使用的一个环境变量,是go项目的工作区根目录。
    • go项目的工作区,一般包含三个文件夹:bin、pkg、src。OGPATH可以设置多个,也就意味着设置一个GOPATH那么其下面的目录结构就要包含bin、pkg、src。
    • 并且当我们引入第三方的包文件时go get,拉取到本地的文件包,将会默认存放到GOPATH的第一个路径中,所以需要特别注意GOPAHT的变量值的顺序。
2. 我的理解
  • GOROOT:就是go语言的安装路径,源码包的位置,当import包时,会优先在这里进行查找。
  • GOPATH:就是按照官方要求完整的一个工作区结构,编写代码要在此结构中完成。如果不设置此工作区,那么GO项目就无法运行起来(go mod先不考虑)。import导入后的包,是基于此路径进行创建的。
  • GOPATH:设置或者修改GOPATH的值,可以用命令set GOPATH=路径会重新覆盖之前的所用,需要重启IDE。
二、为什么
解决什么问题,可以带来什么好处?

优点:

  1. 项目目录清晰,规则简单。
  2. 工作目录统一,避免开发人员随意创建目录。

缺点:

  1. 包与包之间的引入验证依赖GOPATH。
  2. 项目之间的互相调用严重依赖。
  3. 多个版本开发时,存在版本不清晰。
  4. 项目开发严重依赖GOPATH,不方便在其他位置任意创建。
三、怎么用
1. 应用场景
# 方式1创建项目:一个工作区多个项目pro1和pro2等等。
--workspace # GOPATH指向位置
  |-- src
  |     |-- pro1 # 项目1
  |     |     |-- main
  |     |     |     |-- main.go
  |     |  
  |     |-- pro2 # 项目2
  |     |     |-- main
  |     |     |     |-- main.go
  |     |
  |-- pkg
  |     |
  |     |
  |     |
  |-- bin
  |     |
# 方式2创建项目:一个工作区一个项目pro1和pro2等等。
# 此时就需要给GOPATH配置多个路径,并且当我们切换项目时,还要注意其顺序,否则引入的包的位置不正确。
--workspace1 # GOPATH指向位置
  |-- src
  |     |-- pro1 # 项目1
  |     |     |-- main
  |     |     |     |-- main.go
  |     |  
  |     |
  |-- pkg
  |     |
  |     |
  |     |
  |-- bin
  |     |
  
 --workspace2 # GOPATH指向位置
  |-- src
  |     |-- pro1 # 项目2
  |     |     |-- main
  |     |     |     |-- main.go
  |     |  
  |     |
  |-- pkg
  |     |
  |     |
  |     |
  |-- bin
  |     |
2. 具体应用

使用GOPATH进行构建项目的步骤:

  • 第一步:新建一个文件夹workspace1,并且将此文件夹设置为GOPATH,即工作空间。
  • 第二步:在上述创建的文件夹或者工作空间构建下列目录结构:
--workspace1 # GOPATH指向位置
  |-- src
  |     |-- pro1 # 项目1
  |     |     |-- main
  |     |     |     |-- main.go
  |     |  
  |     |
  |-- pkg
  |     |
  |     |
  |     |
  |-- bin
  |     |
  • 第三步:将GOPATH所在的路径加入到系统变量中去,例如:D:\WORKSPACE\Fighting\workspace2
  • 第四步:如果用的是GOLAND编辑器,那么点开设置,做以下几件事:
    • 设置GOPATH,作用域为项目级,关闭全局作用域GOPATH
    • 设置GO MOD,关闭,否则import报错。
  • 第五步:重启IDE。
3. 注意事项
  • Goland默认开启go mod,导致引入包会无法解析。
  • 新建工作区后,还要将新工作区的bin目录位置添加到PATH的环境变量中,这样go相关命令才能找的到。比如workspace1/bin,否则报错package pro1/api is not in GOROOT (D:\WORKSPACE\Fighting\go\src\pro1\api)
  • 如果通过go get拉去第三方包,那么这个包会存放在src下面,并不是pro1这一个层级下面。
  • 开启gopath时,就要关闭go mod 否则找不到包import报错。
四、思考点
1. 它山之石
  1. 在进行Go语言开发的时候,我们的代码总是会保存在 G O P A T H / s r c 目 录 下 。 在 工 程 经 过 g o b u i l d 、 g o i n s t a l l 或 g o g e t 等 指 令 后 , 会 将 下 载 的 第 三 方 包 源 代 码 文 件 放 在 GOPATH/src目录下。在工程经过go build、go install或go get等指令后,会将下载的第三方包源代码文件放在 GOPATH/srcgobuildgoinstallgogetGOPATH/src目录下, 产生的二进制可执行文件放在 $GOPATH/bin目录下,生成的中间缓存文件会被保存在 $GOPATH/pkg 下。
2. 可以攻玉
  1. import包的执行顺序:当引入第三方包的时候,会先去GOROOT下面的src目录下面找,如果找不到,那么就再去GOPATH下面的src目录下面找。备注:也许这就是为什么需要将GOPATH加入到系统变量中去,就是为了import包时方便查找。其实GOROOT也需要加入系统变量,但是,我们的IDE编辑器,有一个设置GOROOT的功能,设置后就不需要加入进去。
五、参考链接
  1. 【Go基础】GOPATH、GOROOT、GOMOD
  2. 【golang】中GOPATH的简单理解
  3. Go中的目录结构
  4. Go开发中GOPATH的理解
  5. 你真的了解GOPATH?
  6. 了解GOPATH
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈文小超_自律

努力自己,幸福他人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值