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语言-在mac下brew升级golang
Apr 25 Golang
golang http使用踩过的坑与填坑指南
Apr 27 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
golang日志包logger的用法详解
May 05 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
基于Go语言构建RESTful API服务
Jul 25 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
MySql中正则表达式的使用方法描述
2008/07/30 PHP
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
如何使用jQuery Draggable和Droppable实现拖拽功能
2013/07/05 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
redux.js详解及基本使用
2019/05/24 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
使用node.JS中的url模块解析URL信息
2020/02/06 Javascript
Python函数返回值实例分析
2015/06/08 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
EGO Shoes美国/加拿大:英国时髦鞋类品牌
2018/08/04 全球购物
校园达人秀策划书
2014/01/12 职场文书
九年级科学教学反思
2014/01/29 职场文书
《匆匆》教学反思
2014/02/22 职场文书
新品发布会策划方案
2014/06/08 职场文书
运动会横幅标语
2014/06/17 职场文书
我爱祖国演讲稿
2014/09/02 职场文书
教师个人学习总结
2015/02/11 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
2015秋学期开学寄语
2015/05/28 职场文书
情感电台广播稿
2015/08/18 职场文书
小学科学课教学反思
2016/02/23 职场文书
Python OpenCV实现图像模板匹配详解
2022/04/07 Python
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang