go语言中GOPATH GOROOT的作用和设置方式


Posted in Golang onMay 05, 2021

GOPATH 和 GOROOT

不同于其他语言,go中没有项目的说法,只有包, 其中有两个重要的路径,GOROOT 和 GOPATH GOROOT是安装目录,GOPATH是我们的工作空间, 用来存放包的目录

GOPATH可以设置多个,其中,第一个将会是默认的包目录,使用 go get 下载的包都会在第一个path中的src目录下,使用 go install时,在哪个GOPATH中找到了这个包,就会在哪个GOPATH下的bin目录生成可执行文件

修改 GOPATH 和 GOROOT

安装的时候如果没有更改设置,默认的GOROOT是在 C:\Go中,而 GOPATH会是在 C:\users\youName\go,

如果我们更改了go的安装位置,那么可以需要设置一下GOROOT 环境变量了

打开环境变量设置,查看下面的系统变量,如果有 GOROOT这个选项的话,查看是否需要更改,没有的话,新建一个就可以了,如图:

go语言中GOPATH GOROOT的作用和设置方式

同理,如果我们想在加一个工作空间的话,直接更改 GOPATH就可以了, go安装的时候会在上面的用户变量中添加GOPATH, 如果没有的话像上一步一样新建就可以了,多个目录使用 ; 分号隔开

go语言中GOPATH GOROOT的作用和设置方式

不管是可执行包,还是非可执行包,通通都应该在某个 $GOPATH/src下。如果你这样做了,那么就不会出现本地包这种写法了

import "./path/package"

比如你可以把你的可执行(项目)包,安放在某个 $GOPATH/src下,例如 $GOPATH/src/app/youpackagedir

这样本地包的import就变成

import "app/yourpackagedir/subpackage"

这样有什么用呢?

1、可以使用 go install 你的子包,有利于go build的时间,如果子包较大,那就更明显了

2、go code的自动完成可以用了

修改完以后需要重启 命令行工具, cmd/powershell/gitbash/Other,不重启不会生效的

补充:Go项目的环境变量GOROOT和GOPATH的设置-那些踩过的坑

那些遇到过的问题

不知道集美们在初次运行go项目的时候会不会遇到一些奇奇怪怪的问题,反正我是遇到了(我自己太菜了)。解决这些问题经常要花半天、一天的时间,甚至是好几个月(其实是被我抛到脑后了,但是迟早要解决)。我就开始陆陆续续把问题及其解决方法整理出来,形成了该篇文章。

import "github.com/xx/xx"出问题?

can't resolve the diectory

需要go get github.com\xx\xx,将包从github上下载下来,自动放在gopath设置的路径里面。

import"golang.org/xx/xx"出问题?

使用go get golang,org/xx/xx方法不能下下来。golang组织在github上建了一个镜像库。下载方法如下:

首先在gopath下创建好src/golang.org/x/目录。后面就是按照同样的方式进行下载了。比如golang.org/x/text,拉取该模块代码:

git clone https://github.com/golang/net.git

其他的子包下载:

$ git clone https://github.com/golang/tour.git
$ git clone https://github.com/golang/net.git
$ git clone https://github.com/golang/blog.git
$ git clone https://github.com/golang/sync.git
$ git clone https://github.com/golang/tools.git
$ git clone https://github.com/golang/lint.git

设置GOROOT和GOPATH

先设置系统环境变量

go语言中GOPATH GOROOT的作用和设置方式

GOROOT应为go sdk的安装目录。GOPATH可以设定为自己想要的位置,以后go项目需要的依赖库都会存放在这个路径下面。

设置GOLAND中的GOROOT和GOPATH

GOROOT为go sdk的安装目录

go语言中GOPATH GOROOT的作用和设置方式

GOPATH不用改变,自动为系统变量。

go语言中GOPATH GOROOT的作用和设置方式

Go Modules(vgo)enable选项注意取消勾选或者勾选

go语言中GOPATH GOROOT的作用和设置方式

用命令行编译,运行go项目,包含好几个go文件

go项目文件列表如下

go语言中GOPATH GOROOT的作用和设置方式

进入go项目的目录,并运行go build,生成exe文件,结果如下

go语言中GOPATH GOROOT的作用和设置方式

go语言中GOPATH GOROOT的作用和设置方式

最后运行可执行文件即可

go语言中GOPATH GOROOT的作用和设置方式

运行内部包含多个 包的go项目

前面介绍了如何在命令行使用go命令编译和运行包含多个go文件的项目。但是实际中的项目里面往往是有多个包组成,即有一定的层级结构,划分不同的功能(我是这么理解的),有的用于配置Config包,有的用于数据模型生成data,有的用于服务service。直接用go build在项目根目录是不好使的,出错。项目的运行往往需要很多包,包括内部和外部的。这里就可以用到go mod,管理项目依赖包,很好使。

介绍go module及区分go get

go get: 若是GOPATH设置的工程目录,代码在src目录下,然后在命令提示符中输入:go get github.com/astaxie/beego,这样就在src目录下生成了github.com/astaxie/beego包。注意:在使用GoLand工具时,配置settings->Go->GOPATH->Project GOPATH为当前工程目录

值得一提的是,若是想要在其他位置新建go项目,就不得不更改系统变量GOPATH,将其设为新项目的位置,可能还要改goland中的GOPATH设置。比较麻烦。外部依赖包都存放在同一个位置,没有项目私有的外部依赖包存放位置,不便于移植项目到连不上互联网的电脑上。

go mod是golang1.11后引入的package依赖管理工具,用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包管理。之前主要是用GOPATH 和 Vendor,vendor相对主流,但现在官方更提倡go mod。[3]

go module(mod):Go 的 1.11版本以上才能使用Go Module,1.13版本以下Go Module默认关闭,首先需要设置环境变量

go env -w GOPROXY=https://goproxy.io,direct 
go env -w GO111MODULE=on set GO111MODULE=on

在GOPATH的目录下,新建项目文件夹,进入新建路径执行go mod init,在文件夹下生成go.mod文件,然后将需要引入外部包的go文件置于项目目录下,编译文件,就会把外部包下载到本地的GOPATH/pkg/mod目录下。

set GO111MODULE=off,GOPATH mode,查找vendor和GOPATH目录。

set GO111MODULE=auto,如果当前目录不在$GOPATH 并且 当前目录(或者父目录)下有go.mod文件,则使用 GO111MODULE, 否则仍旧使用 GOPATH mode。

注意:在使用GoLand工具时,不要配置Project GOPATH为当前工程目录,最好不要配置Project GOPATH,而是配置Module GOPATH [2] 在使用模块的时候, GOPATH 是无意义的,不过它还是会把下载的依赖储存在 GOPATH/src/mod 中,也会把 go install 的结果放在 GOPATH/bin(如果 GOBIN 不存在的话)

相关命令[3]

1、指定module根目录并生成go.mod文件

go mod init example.com/hello

2、下载并添加依赖到go.mod文件中

go build src/service
go test src/sevice

3、查看module下的所有依赖

go list -m all

4、更新稳定版依赖

go get rsc.io/sampler

5、更新为指定版本依赖

go list -m -versions rsc.io/sampler
 
rsc.io/sampler v1.0.0 v1.2.0 v1.2.1 v1.3.0 v1.3.1 v1.99.99
 
go get rsc.io/sampler@v1.3.1

6、清理无用的依赖

go mod tidy

7、将依赖复制到项目路径的vendor文件夹中

go mod vendor

8、忽略cache里的包,只使用vendor目录里的依赖进行编译

go build -mod=vendor

9、校验依赖并查看是否有修改

go mod verify

GoLand go module 配置

使用go module,依赖包存放于GOPATH下

优先级:global path < project path < module path

勾选enable module选项

go语言中GOPATH GOROOT的作用和设置方式

保持不变

go语言中GOPATH GOROOT的作用和设置方式

使用vendor

注意要使用命令行,并勾选vendor

go语言中GOPATH GOROOT的作用和设置方式

type *http.Server has no field or method ProxyRemoteAddr

是下载好依赖后,编译时老是出现上诉问题,说外部依赖包里面有相关变量或方法没定义。明明是网上下载的依赖包,自己又没有修改,怎么会出现编译通不过的问题?

对于https://github.com/csby/wsf来说就是这样,出现问题

后面发现在它的readme.md文件中已经有说明:

go语言中GOPATH GOROOT的作用和设置方式

提示我们对源代码作出以下修改。

按照它的提示修改后,编译通过。go项目成功跑起来。

发现这些花了我一天多的时间。

命令行运行项目

项目结构

srv(config()、data()、 enum()、 handler()、 service()、go.mod)

为项目添加go.mod文件

go mod init srv

往go.mod里面添加各个组件的依赖包

go build srv/config
go build srv/data
go build srv/enum
go build srv/service
go run srv/servive

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
golang slice元素去重操作
Apr 30 Golang
Golang中异常处理机制详解
Jun 08 Golang
Go timer如何调度
Jun 09 Golang
Go语言基础知识点介绍
Jul 04 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Go gorilla securecookie库的安装使用详解
Aug 14 Golang
go设置多个GOPATH的方式
May 05 #Golang
浅谈golang 中time.After释放的问题
May 05 #Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 #Golang
golang日志包logger的用法详解
May 05 #Golang
golang elasticsearch Client的使用详解
May 05 #Golang
goland设置颜色和字体的操作
golang协程池模拟实现群发邮件功能
You might like
各种咖啡的英文名子是什么
2021/03/03 新手入门
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
php 启动报错如何解决
2014/01/17 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
2017/04/03 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
JavaScript 无符号右移赋值操作
2009/04/17 Javascript
CutePsWheel javascript libary 控制输入文本框为可使用滚轮控制的js库
2010/02/07 Javascript
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
JS图片等比例缩放方法完整示例
2016/08/03 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
vue 权限认证token的实现方法
2018/07/17 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
2020/08/19 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
python简单获取本机计算机名和IP地址的方法
2015/06/03 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
python生成器推导式用法简单示例
2019/10/08 Python
在echarts中图例legend和坐标系grid实现左右布局实例
2020/05/16 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
FC-Moto丹麦:欧洲最大的摩托车服装和头盔商店之一
2019/08/20 全球购物
小学教师的个人自我鉴定
2013/10/26 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
事业单位岗位说明书
2015/10/08 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android