GOROOT、GOPATH、Go Modules 三者的关系介绍
GOROOT
GOROOT路径即为存放Golang语言内建的程序库的所在位置,简单地说就是Golang的安装路径
若按照Folang-Download and install流程,则由go env命令查询到的结果为GOROOT="/usr/local/go"
GOPATH 和 Go Modules
GOPATH 是一个路径,若初次安装Golang且未修改环境变量,则GOPATH默认为用户目录下的go文件夹(例如root用户的默认GOPATH为
/root/go,普通用户user的默认GOPATH为/home/user/go)
Go Modules 是Go 1.11版本之后发布的dependency management system
从上述概念来说,二者是没有任何联系的,但是GOPATH的概念并不能体现出其在项目构建上的作用
这两个概念看似不相干,但实际上他们代表着先后两种项目构建模式:经典的GOPATH mode 和 目前的go Modules mode,这两个概念是两种设计模式的产物,并不能说二者毫无关联,因为在Go Modules模式下仍然会使用到GOPATH(go install会将可执行文件放置于$GOPATH/bin下)
之所以混乱,是因为其是一个历史发展的过程,而且后者模式并没有完全脱离前者,
经典的GOPATH mode
此模式下,项目结构如下图所示

目前的go Modules mode
Go Modules
想要理解Go Modules,需要理清Go project构建方式的发展历程.
- 在Go 1.11版本之前,代码分为两种情况,一是
import语言内建的程序库(位于$GOROOT/pkg下),另一种是import第三方的程序库
对于前者,在任意目录下仅需要创建以下单文件,执行go run main.go命令即可运行,go run将代码进行编译并生成执行文件,而编译文件跟执行文件存在一个暂存文件夹内,当运行完此程序就会自动删除。 该指令可以想成类似解释的方式运行,而不需要做其他任何环境设定,即可运行。
// main.go
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
对于后者,同样的单文件执行go run main.go命令,会出现以下错误.
// main.go
package main
import "github.com/gin-gonic/gin"
func main() {
router := gin.Default()
router.Run()
}
由错误信息可知,第三方包的搜索顺序是$GOROOT/src/->$GOPATH/src/,若两个路径下都未找到,则代码无法运行.
main.go:2:8: cannot find package "github.com/gin-gonic/gin" in any of:
/usr/local/go/src/github.com/gin-gonic/gin (from $GOROOT)
/root/go/src/github.com/gin-gonic/gin (from $GOPATH)
不难注意到,两个路径中都涉及到一个src目录,实际上在Go 1.11版本之前的项目结构如下图所示,
- bin: 存放
go build编译生成的可执行文件,go build <filename>会在指定文件的当前目录生成可执行文件;go build <projectname>会在当前目录生成$GOPATH/src/projectname编译出的可执行文件;可通过-o参数指定输出文件的路径,但源文件的根路径只能是$GOPATH/src,无法指定其他路径 - pkg: 当项目过大时,
go build的编译速度很慢, - src: 存放项目的源代码
A[Go-project] --- B[bin]
A[Go-project] --- C[pkg]
A[Go-project] --- D[src]
在理解这3个目录的作用之前,首先需要理解一下
关于这3个目录的作用,需要首先理解2个命令,go build 和 go install
go build <filename>: 在的当前目录生成可执行文件
go build <projectname>: 在当前目录生成$GOPATH/src/projectname编译出的可执行文件
go install <main包-filename>:
go install <main包-filename>:
- 在Go 1.11版本之前
至此虽然搞清了GOROOT和GOPATH的具体值,但是它们究竟起到何种作用仍然是不清晰的.起到干扰作用的
在后续的coding过程中,会很自然地发现一个问题
在,构建一个go project的方式为
参考
在传统gopath模式下,多项目的构建方式令人疑惑
在考虑传统模式下多项目的构建方式时,尝试在$GOPATH/src/project下创建2个文件,一个文件package写的非main,另一个文件package写的main,完全不对
然后不知道怎么就想到go文件里面写的package又可以和所在目录名称不同,这样对于包的理解就出现了疑惑,感觉有点混乱
GOROOT、GOPATH、Go Modules 三者的关系介绍的更多相关文章
- 简述configure、pkg-config、pkg_config_path三者的关系
简述configure.pkg-config.pkg_config_path三者的关系 一.什么是configure 源码安装过程中大多会用到configure这个程序,一般的configure都是一 ...
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍
一. Prototype.__proto__与Object.Function关系介绍 Function.Object:都是Js自带的函数对象.prototype,每一个函数对象都有一个显式的proto ...
- Javascript Prototype __proto__ constructor 三者的关系
JavaScript三大毒瘤 --- this,原型链,作用域 在我等菜鸟一步一步升级中的过程中,这三个概念总是困扰这我们(可能只有我吧,我比较蠢).这三个东西往往都很绕,今天我就来分享一下我对原型. ...
- 关于eth0 eth0:1 和eth0.1关系介绍
eth0 eth0:1 和eth0.1三者的关系对应于物理网卡.子网卡.虚拟VLAN网卡的关系:物理网卡:物理网卡这里指的是服务器上实际的网络接口设备,这里我服务器上双网卡,在系统中看到的2个物理网卡 ...
- HTML、 CSS、 JavaScript三者的关系 1
HTML. CSS. JavaScript三者的关系 网页主要由三部分组成: 结构( Structure) . 表现( Presentation) 和行为( Behavior) HTML —— ...
- 【转】Js中Prototype、__proto__、Constructor、Object、Function关系介绍
一 Prototype.__proto__与Object.Function关系介绍 Function.Object:Js自带的函数对象. prototype,每一个 ...
- GOROOT,GOPATH,GOBIN,project
GOROOT,GOPATH,GOBIN,project目录 我们接下来一个一个来看关于Go语言中的三个目录的详细解释先通过go env查看go的环境变量(我这里是mac的环境,所以可能和你的不同) ...
- LinkedList、ArrayList、Vector三者的关系与区别?
LinkedList.ArrayList.Vector三者的关系与区别? 区分ArrayList,Vector,LinkedList的区别 ArrayList,Vector的区别: 1.出现版本:Ar ...
- HTML、 CSS、 JavaScript三者的关系
HTML. CSS. JavaScript三者的关系 网页主要由三部分组成: 结构( Structure) . 表现( Presentation) 和行为( Behavior) HTML ...
- 设备树里面#address-cells 、#size-cells、reg三者的关系
栗子1: cpus { #address-cells = <>; #size-cells = <>; cpu@ { compatible = "arm,cortex- ...
随机推荐
- 各种相机以及图片-SLAM14CP5
--2020.10.20 开始学习SLAM.想着从SLAM开始然后做三维重建.前面的李群李代数以及旋转四元数有点复杂.都看过了一遍.但不太理解就先放放.希望接下去能够顺利进行.数学基础可能不是很好,公 ...
- <四>JMeter数据库连接/后置处理器/断言简介
一.数据库连接 1.右键线程组添加--配置元件--JDB Cconnection Configuration 2.配置如下: URL为数据路连接地址,用户名密码为数据库用户名和密码 3.添加一个JDB ...
- 【批量下载】url——wget,给定网址,批量下载文件
写在前面:最近在学习批量下载sci文章并传入noteexpress,从网上学来了一些方法,其中有一步需要使用url将sci-hub上面的文章批量下载下来. 学习网址:[研究生]快速批量下载 Web o ...
- Day12-面向对象初识
面向对象编程 Java的核心思想就是OOP 一.面向过程&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么...... 面对过程适合处理一些较为简单的问题 面向对象思想: 物 ...
- C++中,get getline gets 用法
1.cin 2.cin.get() 3.cin.getline() 4.getline() 5.gets() 6.getchar() 1.cin>> 用法1:最基本,也是最常用的用法,输入 ...
- Jmeter一、开源软件的崛起
一.jmeter自身特点: 1.开源,轻量级,更适合自动化和持续集成. 2.学习难度大. 3.资料少.多英文. 二.性能测试工具选型的原则 1.成本: a.工具成本 b.学习成本 2.通信协议: a. ...
- module ‘pip‘ has no attribute ‘pep425tags‘的解决方案
可行方案: E:\pyth\Anaconda\envs>python -m pip debug --verboseWARNING: This command is only meant for ...
- JavaScript常见事件记录
JavaScript常见事件记录 onblur: 元素失去焦点 onfocus: 元素获得焦点 onchange: 用户改变域的内容 onclick: 鼠标点击某个对象 ondblclick: 鼠标双 ...
- Python爬虫之Scrapy制作爬虫
前几天我有用过Scrapy架构编写了一篇爬虫的代码案例深受各位朋友们喜欢,今天趁着热乎在上一篇有关Scrapy制作的爬虫代码,相信有些基础的程序员应该能看的懂,很简单,废话不多说一起来看看. 前期准备 ...
- 杨辉三角形实现过程详解-C语言基础
这一篇要探讨的是"杨辉三角形的实现以及如何人工走循环".涉及的知识点和内容很少,主要是想说明如何看懂循环,如何跟着循环走.属于C语言基础篇. 学习编程的人,在学习的初期,几乎都会接 ...