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构建方式的发展历程.

  1. 在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: 存放项目的源代码
graph LR
A[Go-project] --- B[bin]
A[Go-project] --- C[pkg]
A[Go-project] --- D[src]

在理解这3个目录的作用之前,首先需要理解一下

关于这3个目录的作用,需要首先理解2个命令,go buildgo install

go build <filename>: 在的当前目录生成可执行文件

go build <projectname>: 在当前目录生成$GOPATH/src/projectname编译出的可执行文件

go install <main包-filename>:

go install <main包-filename>:

  1. 在Go 1.11版本之前

至此虽然搞清了GOROOT和GOPATH的具体值,但是它们究竟起到何种作用仍然是不清晰的.起到干扰作用的

在后续的coding过程中,会很自然地发现一个问题

在,构建一个go project的方式为

参考

在传统gopath模式下,多项目的构建方式令人疑惑

在考虑传统模式下多项目的构建方式时,尝试在$GOPATH/src/project下创建2个文件,一个文件package写的非main,另一个文件package写的main,完全不对

然后不知道怎么就想到go文件里面写的package又可以和所在目录名称不同,这样对于包的理解就出现了疑惑,感觉有点混乱

GOROOT、GOPATH、Go Modules 三者的关系介绍的更多相关文章

  1. 简述configure、pkg-config、pkg_config_path三者的关系

    简述configure.pkg-config.pkg_config_path三者的关系 一.什么是configure 源码安装过程中大多会用到configure这个程序,一般的configure都是一 ...

  2. Js中Prototype、__proto__、Constructor、Object、Function关系介绍

    一. Prototype.__proto__与Object.Function关系介绍 Function.Object:都是Js自带的函数对象.prototype,每一个函数对象都有一个显式的proto ...

  3. Javascript Prototype __proto__ constructor 三者的关系

    JavaScript三大毒瘤 --- this,原型链,作用域 在我等菜鸟一步一步升级中的过程中,这三个概念总是困扰这我们(可能只有我吧,我比较蠢).这三个东西往往都很绕,今天我就来分享一下我对原型. ...

  4. 关于eth0 eth0:1 和eth0.1关系介绍

    eth0 eth0:1 和eth0.1三者的关系对应于物理网卡.子网卡.虚拟VLAN网卡的关系:物理网卡:物理网卡这里指的是服务器上实际的网络接口设备,这里我服务器上双网卡,在系统中看到的2个物理网卡 ...

  5. HTML、 CSS、 JavaScript三者的关系 1

    HTML. CSS. JavaScript三者的关系 网页主要由三部分组成: 结构( Structure) . 表现( Presentation) 和行为( Behavior)    HTML —— ...

  6. 【转】Js中Prototype、__proto__、Constructor、Object、Function关系介绍

    一    Prototype.__proto__与Object.Function关系介绍        Function.Object:Js自带的函数对象.         prototype,每一个 ...

  7. GOROOT,GOPATH,GOBIN,project

    GOROOT,GOPATH,GOBIN,project目录   我们接下来一个一个来看关于Go语言中的三个目录的详细解释先通过go env查看go的环境变量(我这里是mac的环境,所以可能和你的不同) ...

  8. LinkedList、ArrayList、Vector三者的关系与区别?

    LinkedList.ArrayList.Vector三者的关系与区别? 区分ArrayList,Vector,LinkedList的区别 ArrayList,Vector的区别: 1.出现版本:Ar ...

  9. HTML、 CSS、 JavaScript三者的关系

    HTML. CSS. JavaScript三者的关系    网页主要由三部分组成: 结构( Structure) . 表现( Presentation) 和行为( Behavior)    HTML ...

  10. 设备树里面#address-cells 、#size-cells、reg三者的关系

    栗子1: cpus { #address-cells = <>; #size-cells = <>; cpu@ { compatible = "arm,cortex- ...

随机推荐

  1. Qt实现带有映射关系的进度条

    1.编写继承自widget的新类,这里我们定义为colorWidget; 2.在colorWidget中添加私有变量QVector<QRect> m_rects,用于存放进度条的不同区间( ...

  2. C语言博客作业07

    1.作业头 这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/SE2020-3 这个作业要求在哪里 https://edu.cnblogs.com/cam ...

  3. 使用 GIT Bash Here 打tar包文件

    1.进入要被  打包的文件目录下 2.点击  Git Bash Here  ---> tar cvf server.tar server/ ok!!!!!!

  4. python批量导出、安装依赖库文件

    导出: 在原环境中 pip freeze > fname.txt 安装: 在新环境中  pip install -r fname.txt 其中fname.txt 可以随意命名,其存储安装库文件列 ...

  5. springboot修改默认端口

    方案一: src/main/resuorces 文件夹下新建application.properties 文件 并添加内容server.port=8011即可 方案二: 使用EmbeddedServl ...

  6. postgresql--column must appear in the group by clause or be used in an aggregate function

    我想得到大于男女平均年龄的人 原表: 在gauss200下执行以下语句: SELECT stname,age,gender,AVG(age) FROM att_test01 GROUP BY gend ...

  7. DevOps Gitlab环境部署

    DevOps 介绍 目录 DevOps 介绍 一.DevOps 介绍 1.1.1 DevOps 介绍 1.1.2 CI/CD简介 1.1.2 Gitlab安装与使用 一.DevOps 介绍 1.1.1 ...

  8. PostgreSQL 存储过程 通过设定条件,返回指定的数据表记录

    PL/pgSQL是 PostgreSQL 数据库系统的一个可装载的过程语言. PL/pgSQL的设计目标是创建一种可装载的过程语言,可以可用于创建函数和触发器过程, 在SQL语言中添加控制结构功能, ...

  9. 初次接触软构和git(使用eclipse)

    目录: 一.git和github 二.软件构造lab1常见问题(eclipse) 一.git和github 1. git的安装 百度git然后去官网安装即可,不会的可以去百度查一下. 2. git和g ...

  10. create-react-app react 使用dll抽离公共库,大幅缩减项目体积,及项目打包速度

    1.安装依赖(clean-webpack-plugin.add-asset-html-webpack-plugin.webpack-cli) yarn add clean-webpack-plugin ...