第一讲 工作区和GOPATH

此为 《极客时间&Go语言核心36讲》 个人笔记,具体课程详见极客时间官网。

Table of Contents generated with DocToc

  • 第一讲 工作区和GOPATH
    • 1. 环境变量配置
    • 2. 配置GOPATH的意义
      • 2.1 Go语言源码的组织方式
      • 2.2 源码安装后的结果(归档文件、可执行文件)
      • 2.3 理解构建和安装Go程序的过程
    • 3. 补充
      • 3.1 go build命令一些可选项的用途和用法
      • 3.2 go get
      • 3.3 其他

第一讲 工作区和GOPATH

1. 环境变量配置

在这个过程需要配置3个环境变量:GOROOTGOPATHGOBIN

  • GOROOTGo语言安装根目录的路径,也就是Go语言的安装路径;
  • GOPATH:若干工作区目录的路径,是我们自己定义的工作空间;
  • GOBINGO程序生成的可执行文件的路径;

2. 配置GOPATH的意义

可以把GOPATH简单理解成Go语言的工作目录,它的值是一个路径,在 GOPATH指定的工作目录下,代码总是会保存在 $GOPATH/src 目录下。在工程经过go buildgo installgo get 等指令后,会将产生的二进制可执行文件放在 $GOPATH/bin 目录下,生成的中间缓存文件会被保存在 $GOPATH/pkg 下。

环境变量 GOPATH 指向的是一个或多个工作区,每个工作区中都会有以代码包为基本组织形式的源码文件。

由于Go语言项目在其生命周期内的所有操作(编码、依赖管理、构建、测试、安装等)基本上都围绕GOPATH和工作区进行,所以可以拓展出其他问题:

2.1 Go语言源码的组织方式

和大多数编程语言一样,Go语言的源码也是以代码包为基本单位的。每个代码包都会有导入路径,在使用程序实体之前都必须导入其所在的代码包,例如:

import "github.com/labstack/echo"

在工作区中,一个代码包的导入路径实际上就是从src子目录,到该包的实际存储位置的相对路径。一般情况下,Go语言的源码文件都需要被存放在环境变量GOPATH包含的某个工作区(目录)中的src目录下的某个代码包(目录)中。

2.2 源码安装后的结果(归档文件、可执行文件)

源码文件通常会被放在某个工作区的src子目录下,那么在安装后如果产生了归档文件(xxx.a,程序编译后生成的静态库文件),就会放进该工作区的pkg子目录;如果产生了可执行文件,就会放进该工作区的bin子目录下。

归档文件的相对目录与pkg目录之间还有一集目录,叫做平台相关目录,一般是由构建(build)的目标操作系统、下划线和木匾计算架构的代号组成。

在这里插入图片描述

2.3 理解构建和安装Go程序的过程

构建使用命令go build,安装使用命令go install,构建和安装代码包的时候都会执行编译、打包等操作。

库源码文件命令源码文件
构建操作的结果文件只存在于临时文件,这里构建的主要意义在于检查和验证操作的结果文件会被搬运到源码文件所在的目录中
安装先执行构建,然后还会进行链接操作,并把结果文件搬运到它所在工作区的pkg目录下的某个子目录中结果文件会被搬运到它所在工作区的bin目录中,或者环境变量GOBIN指向的目录中

3. 补充

3.1 go build命令一些可选项的用途和用法

go build时,默认不会编译目标代码包所依赖的那些代码包,除非它依赖的代码包的归档文件不存在,或者(被依赖代码包的)源码文件有了变化,同时,还可以可以使用-a来强制编译。另外,如果不但要编译依赖的代码包,还要安装它们的归档文件,可以使用-i

  • -x:查看go build命令具体都执行了哪些操作;
  • -n:查看操作而不执行;
  • -v:查看go build命令编译的代码包名称;
3.2 go get

go get会自动从一些主流代码库下载目标代码,并把它们安装到环境变量GOPATH包含的第一个工作区的相应目录中。如果存在环境变量GOBIN,那么仅包含命令源码文件的代码包会被安装到GOBIN指向的那个目录。

  • -u:下载并安装代码包,无论工作区是否已经存在它们;
  • -d:只下载代码包,但不安装;
  • -fix:下载代码包后,先运行一个修正代码的工具,然后再安装;
  • -t:下载并测试所需的代码包;
  • -insecure:允许通过非安全的网络协议下载和安装代码包;(例如:http…)
3.3 其他
  • Go语言在多个工作区中查找依赖包的时候是以怎样的顺序进行的?

    根据GOPATH从上到下查找。

  • 如果多个工作区中存在导入路径相同的代码包会产生冲突吗?

    不会,代码包上根据GOPATH从上到下查找,找到即可停止,先找到哪个就用哪个。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发大会上,前微软CEO放出的狠话!.NET开发随时起飞,你准备好了吗?

“开发者,开发者,开发者,开发者”,微软前任CEO史蒂夫鲍尔默(Steve Ballmer)用这种略带疯狂、又唱又跳的方式表达他对开发者的热爱。不夸张的说,相比二十年前那个如日中天的巨无霸微软,现在的微软比以往任何…

程序员过关斩将--为微服务撸一个简约而不简单的配置中心

点击上方蓝字 关注我们毫不犹豫的说,现代高速发展的互联网造就了一批又一批的网络红人,这一批批网红又极大的催生了特定平台的一大波流量,但是留给了程序员却是一地鸡毛,无论是运维还是开发,每天都会担心服务器崩溃&a…

Just a Hook HDU - 1698(查询区间求和+最基础模板)

题意: 给你一个1~n的区间,起始区间内均为1,然后对子区间进行值更新,最后求区间和。 题目: In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is ma…

DDIA笔记——数据复制

Table of Contents generated with DocToc 此篇为《数据密集型应用系统设计》(DDIA)读书笔记,笔记可能存在遗漏,建议直接阅读原书。 第五章 数据复制 主从复制 复制滞后复制滞后带来的问题 多主节点复制 适用场景处理写冲突拓扑结…

基于 abp vNext 和 .NET Core 开发博客项目 - 集成Hangfire实现定时任务处理

上一篇文章成功使用了Redis缓存数据,大大提高博客的响应性能。接下来,将完成一个任务调度中心,关于定时任务有多种处理方式,如果你的需求比较简单,比如就是单纯的过多少时间循环执行某个操作,可以直接使用.…

Docker基本组成 和 基本命令

此篇为Docker笔记,文章可能存在疏忽,建议直接观看原视频。 视频地址:https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from333.999.0.0 Docker基本组成 和 基本命令 镜像 image:就好比一个模板,可以通过这个模板…

Docker镜像讲解

此篇为Docker笔记,文章可能存在疏忽,建议直接观看原视频。 视频地址:https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from333.999.0.0 参考:https://blog.csdn.net/11b202/article/details/21389067 Docker镜像讲解 镜像是…

Making the Grade POJ - 3666(离散化+dp)

题意: 给你n个山的高度,单独的一个数可以任意加减,让经过对每座山峰任意加减高度后变成递增或递减的序列时,求对每个数的相加或相减的数目的最小和。 题目: A straight dirt road connects two fields on FJ’s far…

Kubernetes的安全性怎么解?从4个方面为你列出方案清单

导语Kubernetes中的安全性是一个多维问题,必须从各个不同的角度来解决才算完善,这篇文章将从4个方面为读者列出安全清单。正文Kubernetes,经过更快的采用和社区的更多贡献,正日益攀登到新的高度。不过,安全性仍然是Kub…

DDIA笔记—第六章 数据分区

第六章 数据分区 数据分区与数据复制 分区通常与复制结合使用,即每个分区在多个节点都存在副本,这就意味着某条记录属于特定的分区,而同样的内容会保存在不同的节点上以提高系统的容错性。 每个节点同时充当某些分区的主副本和其他分区的从…

Magicodes.IE 2.2发布

Magicodes.IE 2.2发布导入导出通用库,支持DTO导入导出以及动态导出,支持Excel、Word、PDF、CSV和HTML。已加入ncc开源组织.Magicodes.IE2.0发布Magicodes.IE2.1发布如何做好一个开源项目(一)GitHub:https://github.com/dotnetcore/Magicodes.…

C++ 基类,子对象,派生类构造函数调用顺序

#include <iostream> using namespace std;class A {public:A( ) {cout << "A Constructor………" << endl;}~A( ) {cout << "A Destructor………" << endl;} };class B: public A {public:B( ) {cout << "B …

C++ 虚析构函数

代码如下: #include <iostream> using namespace std;class Base {public:Base() {cout << "Base" << endl;}~Base() {cout << "Base destructor" << endl;} };class Derived : public Base {public:Derived() {cout <&…

I - Interesting Permutation Gym - 102394I(排列组合)

题意&#xff1a; 纯数题 1≤i≤n, fimax{a1,a2,…,ai}; 1≤i≤n, gimin{a1,a2,…,ai}; 1≤i≤n, hifi−gi. 数列a是一个排列&#xff0c;问多少种排列方式满足h数列。 题目&#xff1a; DreamGrid has an interesting permutation of 1,2,…,n denoted by a1,a2,…,an. He …

Magicodes.SwaggerUI 已支持.NET Core 3.1

Magicodes.SwaggerUI 通过配置文件简单配置即可快速完成SwaggerUI的配置&#xff0c;包括&#xff1a;SwaggerUI的文档信息API分组API隐藏API JSON生成&#xff08;枚举、API架构Id&#xff09;验证自定义页面支持.NET Core 2.2和3.1。版本日志和使用教程见下文。注意&#xff…

[推荐]大量 Blazor 学习资源(二)

继上一篇《[推荐]大量 Blazor 学习资源&#xff08;一&#xff09;》之后&#xff0c;社区反应不错&#xff0c;但因个人原因导致这篇文章姗姗来迟&#xff0c;不过最终还是来了&#xff01;这篇文章主要收集一些常用组件、书籍和电子书。资料来源&#xff1a;https://github.c…