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 相关文章推荐
Go语言带缓冲的通道实现
Apr 26 Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
golang中切片copy复制和等号复制的区别介绍
Apr 27 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang并发工具Singleflight
May 06 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
乐信RP2100的电路分析和打磨
2021/03/02 无线电
JQuery 获得绝对,相对位置的坐标方法
2010/02/09 Javascript
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
基于jquery的滑动样例代码
2010/11/20 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
js,jquery滚动/跳转页面到指定位置的实现思路
2014/06/03 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
nodejs实现爬取网站图片功能
2017/12/14 NodeJs
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
[36:14]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第二局
2016/02/28 DOTA
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
Python while 循环使用的简单实例
2016/06/08 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
如何使用python代码操作git代码
2020/02/29 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
python 递归相关知识总结
2021/03/03 Python
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
日本著名的服饰鞋帽综合类购物网站:MAGASEEK
2019/01/09 全球购物
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
得到Class的三个过程是什么
2012/08/10 面试题
宿舍打麻将检讨书
2014/01/24 职场文书
运动会入场解说词300字
2014/01/25 职场文书
创建省级文明单位实施方案
2014/02/27 职场文书
创先争优个人承诺书
2014/08/30 职场文书
2014年护理部工作总结
2014/11/14 职场文书
妈妈别哭观后感
2015/06/08 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
Python 数据可视化之Bokeh详解
2021/11/02 Python