模块一 Go语言基础知识-工作区和GOPATH

vins-mono前端详解(2)——imu预积分 本篇文章详细讲解了vins-mono中imu预积分内容,包括复杂的公式推导。 阅读详情

我们学习 Go 语言时,要做的第一件事,都是根据自己电脑的计算架构(比如,是 32 位的计算机还是 64 位的计算机)以及操作系统(比如,是 Windows 还是 Linux),从Go 语言官网下载对应的二进制包,也就是可以拿来即用的安装包。

随后,我们会解压缩安装包、放置到某个目录、配置环境变量,并通过在命令行中输入go version来验证是否安装成功。

在这个过程中,我们还需要配置 3 个环境变量,也就是 GOROOT、GOPATH 和 GOBIN。这里我可以简单介绍一下。

  • GOROOT:Go 语言安装根目录的路径,也就是 GO 语言的安装路径。
  • GOPATH:若干工作区目录的路径。是我们自己定义的工作空间。
  • GOBIN:GO 程序生成的可执行文件(executable file)的路径。

其中,GOPATH 背后的概念是最多的,也是最重要的。那么,今天我们的面试问题是:你知道设置 GOPATH 有什么意义吗?

典型回答:你可以把 GOPATH 简单理解成 Go 语言的工作目录,它的值是一个目录的路径,也可以是多个目录路径,每个目录都代表 Go 语言的一个工作区(workspace)。

我们需要利于这些工作区,去放置 Go 语言的源码文件(source file),以及安装(install)后的归档文件(archive file,也就是以“.a”为扩展名的文件)和可执行文件(executable file)。

事实上,由于 Go 语言项目在其生命周期内的所有操作(编码、依赖管理、构建、测试、安装等)基本上都是围绕着 GOPATH 和工作区进行的。所以,它的背后至少有 3 个知识点,分别是:

1. Go 语言源码的组织方式是怎样的;

2. 你是否了解源码安装后的结果(只有在安装后,Go 语言源码才能被我们或其他代码使用);

3. 你是否理解构建和安装 Go 程序的过程(这在开发程序以及查找程序问题的时候都很有用,否则你很可能会走弯路)。

 

知识扩展

1. Go 语言源码的组织方式

与许多编程语言一样,Go 语言的源码也是以代码包为基本组织单位的。在文件系统中,这些代码包其实是与目录一一对应的。由于目录可以有子目录,所以代码包也可以有子包。

一个代码包中可以包含任意个以.go 为扩展名的源码文件,这些源码文件都需要被声明属于同一个代码包。

代码包的名称一般会与源码文件所在的目录同名。如果不同名,那么在构建、安装的过程中会以代码包名称为准。

每个代码包都会有导入路径。代码包的导入路径是其他代码在使用该包中的程序实体时,需要引入的路径。在实际使用程序实体之前,我们必须先导入其所在的代码包。具体的方式就是import该代码包的导入路径。就像这样:

import "github.com/mailru/easyjson"

在工作区中,一个代码包的导入路径实际上就是从 src 子目录,到该包的实际存储位置的相对路径。

所以说,Go 语言源码的组织方式就是以环境变量 GOPATH、工作区、src 目录和代码包为主线的。一般情况下,Go 语言的源码文件都需要被存放在环境变量 GOPATH 包含的某个工作区(目录)中的 src 目录下的某个代码包(目录)中。

2. 了解源码安装后的结果

了解了 Go 语言源码的组织方式后,我们很有必要知道 Go 语言源码在安装后会产生怎样的结果。

源码文件以及安装后的结果文件都会放到哪里呢?我们都知道,源码文件通常会被放在某个工作区的 src 子目录下。

那么在安装后如果产生了归档文件(以“.a”为扩展名的文件),就会放进该工作区的 pkg 子目录;如果产生了可执行文件,就可能会放进该工作区的 bin 子目录。

我再讲一下归档文件存放的具体位置和规则。

源码文件会以代码包的形式组织起来,一个代码包其实就对应一个目录。安装某个代码包而产生的归档文件是与这个代码包同名的。

放置它的相对目录就是该代码包的导入路径的直接父级。比如,一个已存在的代码包的导入路径是

github.com/mailru/easyjson

那么执行命令

go install github.com/mailru/easyjson

生成的归档文件的相对目录就是github.com/mailru,文件名为easyjson.a。

顺便说一下,上面这个代码包导入路径还有另外一层含义,那就是:该代码包的源码文件存在于 GitHub 网站的 mailru组的代码仓库 easyjson中。

再说回来,归档文件的相对目录与 pkg 目录之间还有一级目录,叫做平台相关目录。平台相关目录的名称是由 build(也称“构建”)的目标操作系统、下划线和目标计算架构的代号组成的。

比如,构建某个代码包时的目标操作系统是 Linux,目标计算架构是 64 位的,那么对应的平台相关目录就是 linux_amd64。

因此,上述代码包的归档文件就会被放置在当前工作区的子目录pkg/windows_amd64/github.com/mailru中。

 

 

 总之,你需要记住的是,某个工作区的 src 子目录下的源码文件在安装后一般会被放置到当前工作区的 pkg 子目录下对应的目录中,或者被直接放置到该工作区的 bin 子目录中。

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

我们再来说说构建和安装 Go 程序的过程都是怎样的,以及它们的异同点

构建使用命令go build,安装使用命令go install。构建和安装代码包的时候都会执行编译、打包等操作,并且,这些操作生成的任何文件都会先被保存到某个临时的目录中。

如果构建的是库源码文件,那么操作后产生的结果文件只会存在于临时目录中。这里的构建的主要意义在于检查和验证。

如果构建的是命令源码文件,那么操作的结果文件会被搬运到源码文件所在的目录中。

安装操作会先执行构建,然后还会进行链接操作,并且把结果文件搬运到指定目录。

进一步说,如果安装的是库源码文件,那么结果文件会被搬运到它所在工作区的 pkg 目录下的某个子目录中。

如果安装的是命令源码文件,那么结果文件会被搬运到它所在工作区的 bin 目录中,或者环境变量GOBIN指向的目录中。

这里你需要记住的是,构建和安装的不同之处,以及执行相应命令后得到的结果文件都会出现在哪里。

 

总结

工作区和 GOPATH 的概念和含义是每个 Go 工程师都需要了解的。虽然它们都比较简单,但是说它们是 Go 程序开发的核心知识并不为过。

然而,我在招聘面试的过程中仍然发现有人忽略掉了它们。Go 语言提供的很多工具都是在 GOPATH 和工作区的基础上运行的,比如上面提到的go build、go install和go get,这三个命令也是我们最常用到的。

 

思考题

  1. Go 语言在多个工作区中查找依赖包的时候是以怎样的顺序进行的?
  2. 如果在多个工作区中都存在导入路径相同的代码包会产生冲突吗?

这两个问题之间其实是有一些关联的。答案并不复杂,你做几个试验几乎就可以找到它了。你也可以看一下 Go 语言标准库中go build包及其子包的源码。那里面的宝藏也很多,可以助你深刻理解 Go 程序的构建过程。

 

补充

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

在运行go build命令的时候,默认不会编译目标代码包所依赖的那些代码包。当然,如果被依赖的代码包的归档文件不存在,或者源码文件有了变化,那它还是会被编译。

如果要强制编译它们,可以在执行命令的时候加入标记-a。此时,不但目标代码包总是会被编译,它依赖的代码包也总会被编译,即使依赖的是标准库中的代码包也是如此。

另外,如果不但要编译依赖的代码包,还要安装它们的归档文件,那么可以加入标记-i。

那么我们怎么确定哪些代码包被编译了呢?有两种方法。

  1. 运行go build命令时加入标记-x,这样可以看到go build命令具体都执行了哪些操作。另外也可以加入标记-n,这样可以只查看具体操作而不执行它们。
  2. 运行go build命令时加入标记-v,这样可以看到go build命令编译的代码包的名称。它在与-a标记搭配使用时很有用。

下面再说一说与 Go 源码的安装联系很紧密的一个命令:go get。

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

最常用的几个标记有下面几种。

  • -u:下载并安装代码包,不论工作区中是否已存在它们。
  • -d:只下载代码包,不安装代码包。
  • -fix:在下载代码包后先运行一个用于根据当前 Go 语言版本修正代码的工具,然后再安装代码包。
  • -t:同时下载测试所需的代码包。
  • -insecure:允许通过非安全的网络协议下载和安装代码包。HTTP 就是这样的协议。

Go 语言官方提供的go get命令是比较基础的,其中并没有提供依赖管理的功能。目前 GitHub 上有很多提供这类功能的第三方工具,比如glide、gb以及官方出品的dep、vgo等等,它们在内部大都会直接使用go get。

附基础知识图谱

 

从零开始的立绘拆包教程 蓝毒小天使天下第! 本文拆包教程不限于明日方舟,在后面也会给出其他手游的拆包教程,例如少女前线 首先拆包最简单的无非就是拆取游戏资源,例如游戏立绘,音频,视频等,再深层次点有拆取游戏配置文件,apk反编译得到部分源码 在本文,我们只介绍拆取游戏资源对游戏资源的后期处理(因为另外两个讲道理我也没太搞懂,虽然可以提取游戏配置文件,但似乎大部分重要的数据都有加密,反编译出来的源码也只是部分,... 阅读详情

相关推荐

【ARM CoreLink 系列 5.3 -- CI-700 SLC memory 系统组件详细介绍】

在 CI-700 系统级缓存(SLC)内存系统中,HN-F 节点负责管理缓存致性数据传输。每个 HN-F 节点可以发送三种类型的 Snoop 请求,以确保系统中多核处理器缓存之间的致性。CI-700 中的系统级缓存(SLC)内存系统通过 HN-F 节点支持 TrustZone® 技术。以下是 CI-700 支持的 SN 类型以及配置方法的简要介绍。ARM CI-700 系统级缓存(SLC)是个分布式、主要排他性(mostly exclusive) 的最后级缓存,集成在 HN-F 节点内。

CodingCos的博客 844

GOgopls requires a module小白向解决方法

很常见的个问题,虽然程序还是可以执行,不过还是想解决下 这个问题意思是 你的工作区中可能有多个 go 模块。如果是这种情况,你可以更改 go 扩展设置,以允许 gopls 在工作区中查找多个模块。只需将以下内容添加到您的settings.json:(按ctrl+p,输入setting就能搜到) "gopls": { "experimentalWorkspaceModule": true, } 具体如图 新手可能还回碰到个问题,就是这个设置加上去之后,报错Expected comma。这个

qq_37792173的博客 2155

【Java面试题汇总】Spring篇(2026版)

IoC、DI、aop、事务、为什么不建议@Transactional、事务传播级别、@Autowired@Resource注解的区别、BeanFactoryFactoryBean的区别、Bean的作用域,以及默认的作用域、Bean的生命周期、循环依赖、三级缓存、

种一棵树最好的时间是十年前,其次是现在 7285

2. goGOPATHGOROOT、第三方库学习

go基础学习

rui_rui96的博客 8800

Go语言GOPATH是什么

GOPATHGo 语言中使用的个环境变量

路在脚下 8562

Go环境变量配置,及GOROOT、GOPATH的区别

GOPATHGOROOT的配置略有不同,我建议配置两个GOPATH目录,第个用于放 Go 语言的第三方包,第二个用于放自己的开发代码。第二步:继续在GOPATH/src目录去找,准确说是GOPATH/src/Go-Player/src/chapter17/models这个目录。使用GOPATH时,项目中import引用的第三方包,首先会从GOROOT/src下搜索,如果搜索不到,会到GOPATH/src目录下搜索。第步:Go会先去GOROOT/src目录中查找,很显然它不是标准库的包,没找到。

h_and_g的博客 5583

8.3 Go语言GOPATHGo语言工作目录)

GOPATHGo语言中使用的个环境变量,它使用绝对路径提供项目的工作目录。 工作目录是个工程开发的相对参考目录,好比当你要在公司编写套服务器代码,你的工位所包含的桌面、计算机及椅子就是你的工作区工作区的概念与工作目录的概念也是类似的。如果不使用工作目录的概念,在多人开发时,每个人有套自己的目录结构,读取配置文件的位置不统,输出的二进制运行文件也不统,这样会导致开发的标准不统,影响开发效率。 GOPATH 适合处理大量 Go语言源码、多个包组合而成的复杂工程。 提示 C、C++、Jav

success_zxc的博客 943

模块Go语言基础知识 -01 | 工作区GOPATH

The Go Programming Language Specification Go 语言规范文档 https://golang.google.cn/ref/spec Go 语言官网 https://golang.google.cn/ 需要配置 3 个环境变量,也就是 GOROOT、GOPATH GOBIN。这里我可以简单介绍下。 GOROOT:Go 语言安装根目录的路径,也就是 GO 语言的安装路径。 GOPATH:若干工作区目录的路径。是我们自己定义的工作空间。 GOBIN:G

LTCM_SAKURA的博客 397

Go】笔记 | 工作区GOPATH

首发地址:工作区GOPATH 核心知识 GOPATH的意义在与代码结构分层 Go语言源码的组织方式 以代码包为基本组织单位 代码包与目录对应 目录有子目录,代码包也有子包 代码包中可以任意个.go 扩展名的源码文件,需要被声明为属于同个代码包。 代码包的名称般会与这些源码文件所在的目录同名。如果不同名,那么在构建、安装的过程中会以代码包名称为准。 每个代码包都会有导...

用代码书写梦想 1561

1、Go语言工作区GOPATH实战指南:从项目初始化到部署

本文介绍了Go语言工作区GOPATH的核心概念及实践指南。主要内容包括:Go工作区的基本原理目录结构,如何通过go mod init初始化模块管理依赖,使用go get添加依赖go mod graph查看依赖关系,以及基本的构建(go build)测试(go test)命令。文章旨在帮助开发者理解Go项目组织依赖管理的最佳实践,提升开发效率。最后提供了官方文档等延伸阅读资源,并附有流程图直观展示Go项目从初始化到测试的完整工作流程。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 970

01 | 工作区GOPATH

工作区 GOPATH 的概念含义是每个 Go 工程师都需要了解的。虽然它们都比较简单,但是说它们是 Go 程序开发的核心知识并不为过。然而,我在招聘面试的过程中仍然发现有人忽略掉了它们。Go 语言提供的很多工具都是在 GOPATH 工作区的基础上运行的,比如上面提到的go build、go installgo get,这三个命令也是我们最常用到的。

qq_37756660的博客 1263

golang】工作区GOPATH

工作区 GOPATH 的概念含义是每个 Go 工程师都需要了解的。虽然它们都比较简单,但是说它们是 Go 程序开发的核心知识并不为过。Go 语言提供的很多工具都是在GOPATH 工作区的基础上运行的,比如上面提到的go build、go installgo get,这三个命令也是我们最常用到的。

m0_53328239的博客 996

GO 工作区GOPATH

Go 1.5 版本的自举(即用 Go 语言编写程序来实现 Go 语言自身),到 Go 1.7 版本的极速 GC(也称垃圾回收器),再到 2018 年 2 月发布的 Go 1.10 版本对其自带工具的全面升级,以及可预见的后续版本关键特性(比如用来做程序依赖管理的go mod命令),这切都令我们欢欣鼓舞。Go 语言在步步走向辉煌的同时,显然已经成为软件工程师们最喜爱的编程语言之。 我们学习 Go 语言时,要做的第件事,都是根据自己电脑的计算架构(比如,是 32 位的计算机还是 64 位的计算..

小楼一夜听春雨,深巷明朝卖杏花 828

工作区GOPATH

工作区 GOPATH 的概念含义是每个 Go 工程师都需要了解的。虽然它们都比较简单,但是说它们是 Go 程序开发的核心知识并不为过。然而,我在招聘面试的过程中仍然发现有人忽略掉了它们。Go 语言提供的很多工具都是在 GOPATH 工作区的基础上运行的,比如上面提到的go build、go installgo get,这三个命令也是我们最常用到的。

阅读之后,对你有帮助,那就点个赞再走吧 480

Go Modules(Go Mod)、GOPATH简介

go mod 、go path简介与简单使用

m0_63044390的博客 8501

Go GOROOT 与 GOPATH 介绍

GOROOT:Go 语言安装根目录的路径,也就是 GO 语言的安装路径。 GOPATH:若干工作区目录的路径。是我们自己定义的工作空间。 GOBIN:GO 程序生成的可执行文件(executable file)的路径。 设置 GOPATH得作用 你可以把 GOPATH 简单理解成 Go 语言的工作目录,它的值是个目录的路径,也可以是多个目录路径,每个目录都代表 Go 语言的工作区(works...

爱死亡机器人 3467

Go-知识依赖GOPATH

早期Go语言单纯地使用GOPATH管理依赖,但是GOPATH不方便管理依赖的多个版本,后来增加了vendor,允许把项目依赖连同项目源码同管理。Go 1.11 引入了全新的依赖管理工具 Go Module ,知道 Go 1.14 , Go Module 才走向成熟。

a18792721831的博客 859

彻底搞懂golang的GOROOTGOPATH

**目录 1、GOPATH GOROOT 2、修改 GOPATH GOROOT 3、HelloWord——GOPATH版 4、些踩坑经验** ## 1、GOPATH GOROOT 不同于其他语言,go中没有项目的说法,只有包, 其中有两个重要的路径,***GOROOT*** ***GOPATH*** Go开发相关的环境变量如下: * GOROOT:GOROOT就是Go的安装目录,(类似于java的JDK) * GOPATHGOPATH是我们的工作空间,保存go项目代码第三方依赖

THMAIL的博客 3225

Go语言中的GOPATH解析

在说GOPATH之前,先说说GO语言的项目结构: 1、Go语言中组织单元最大的为项目,项目下包含包。个包可以有多个文件 2、包在物理层面上就是文件夹。同文件夹中多个文件的package必须相同,般package所在的文件夹名称相同 3、Goland中的标准GO项目: Src目录:需要手动创建,main.go是同级别的目录 Go语言必须要求配置GOPATH环境变量,告诉系...

qq_15054345的博客 848

GOPATH 详解

目录 、重要的几个环境变量 二、GOPATH设置 1、使用命令行查看GOPATH信息 2、linux下使用GOPATH的工程结构 3、windows下设置GOPATH 4、在多项目工程中使用GOPATH 三、配置完GOPATH后的工作目录 1、适合个人开发者 2、目前流行的项目结构 3、适合企业开发者 、重要的几个环境变量 $GOROOT表示 Go 的安装目录,它的值般都是$HOME/go,当然,你也可以安装在别的地方。 $GOARCH表示目标机器(目标机器是指...

大道至简,持之以恒! 1万+

解决gopls was not able to find modules in your workspace.

解决gopls was not able to find modules in your workspace.问题。

wsi__的博客 1万+

理解Go语言中的GOPATH

本文将引导您了解什么是`GOPATH`,它是如何工作的,以及如何设置它。这是设置Go开发环境的关键步骤,也是理解Go如何查找、安装构建源文件的关键步骤。在本文中,我们将使用`GOPATH`来讨论我们将要讨论的文件夹结构的概念。我们将使用`$GOPATH`来引用Go用于查找文件夹结构的环境变量。

码觉客的博客 1万+

批量删除QQ空间说说丨2023年最新版QQ空间说说批量删除插件

2023年最新微博新版批量删除QQ空间说说代码QQ空间-plugin2023批量删除QQ空间说说脚本2023最新QQ版本界面:功能包括了最新QQ支持清空QQ空间说说批量删除 安装说明因为Chrome商店开发者注册收费,穷逼学生党,所以没有上架所以按照以下操作安装:clone本仓库到本地在Chrome扩展管理页打开开发这模式点击加载已解压的扩展程序放入本脚本内容保存即可使用说明登陆网页版微博切换到新版UI进入个人主页,在筛选中过滤查出想删除的微博然后点击顶部导航栏头像后的删除按钮即可删除过程中全程自动,可以按键盘的ESC停止删除其他说明该脚本仅用于自用,以及分享给有需要的同学,使用前请谨慎考虑并仔细阅读使用说明,旦出现其他问题,概不负责详细教程:https://blog.csdn.net/wangwei490202517/article/details/129244672

基于matlab平台最小错误率贝叶斯分类决策的手写数字识别系统.zip

基于matlab平台最小错误率贝叶斯分类决策的手写数字识别系统.zip

上一篇: JAVA实现微信支付功能
下一篇: 翻译:《实用的Python编程》00_Setup
Unknowncheats
博客等级 码龄7年 38粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值