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 嵌套 interface 的赋值问题
Apr 29 Golang
Go使用协程交替打印字符
Apr 29 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
Golang全局变量加锁的问题解决
May 08 Golang
go xorm框架的使用
May 22 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
golang中的struct操作
Nov 11 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Go 中的空白标识符下划线
Mar 25 Golang
Golang日志包的使用
Apr 20 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 字符转义 注意事项
2009/05/27 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
2017/08/02 PHP
再谈javascript图片预加载技术(详细演示)
2011/03/12 Javascript
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
2011/12/08 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
浅谈js中的引用和复制(传值和传址)
2016/09/18 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
微信小程序如何连接Java后台
2019/08/08 Javascript
JavaScript实现更换背景图片
2019/10/18 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
python连接sql server乱码的解决方法
2013/01/28 Python
python中的变量如何开辟内存
2018/06/26 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
Python 函数返回值的示例代码
2019/03/11 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
2016/11/21 HTML / CSS
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
2014年党员自我剖析材料
2014/10/07 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
Django rest framework如何自定义用户表
2021/06/09 Python
python 进阶学习之python装饰器小结
2021/09/04 Python