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项目中使用init()
Apr 12 Golang
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
彻底理解golang中什么是nil
Apr 29 Golang
goland设置颜色和字体的操作
May 05 Golang
go设置多个GOPATH的方式
May 05 Golang
Go 自定义package包设置与导入操作
May 06 Golang
go 实现简易端口扫描的示例
May 22 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
Golang解析JSON对象
Apr 30 Golang
Go语言编译原理之源码调试
Aug 05 Golang
go goth封装第三方认证库示例详解
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
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
详解Node项目部署到云服务器上
2017/07/12 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
JavaScript静态作用域和动态作用域实例详解
2019/06/17 Javascript
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
Python装饰器简单用法实例小结
2018/12/03 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
python实现两张图片的像素融合
2019/02/23 Python
python opencv实现图像边缘检测
2019/04/29 Python
Python中变量的输入输出实例代码详解
2019/07/28 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
pandas 缺失值与空值处理的实现方法
2019/10/12 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
基本款天堂:Everlane
2017/05/13 全球购物
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
交通安全教育制度
2014/02/02 职场文书
中年人生感言
2014/02/04 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
女生抽烟检讨书
2014/10/05 职场文书