【golang】工作区与GOPATH

在学习go语言时,我们会从官网下载go语言的二进制包,然后解压并安装到某个目录,最后会配置环境变量,通过输入命令go version来验证是否安装成功。

配置了path环境后,我们还需要再配置3个环境变量,GOROOTGOPATHGOBIN

GOROOT:Go语言安装根目录的路径,也就是GO语言的安装路径。

GOPATH:若干工作区目录的路径。是我们自己定义的工作空间。

GOBIN:GO程序生成的可执行文件(executable file)的路径。

设置GOPATH有什么意义呢?

典型回答:

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

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

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

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

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

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

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

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

"github.com/gin-gonic/gin"

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

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

GOPATH目录约定有三个子目录

  • src:存放源代码(比如:.go .c .h .s等) 按照golang默认约定,go rungo install等命令的当前工作路径(即在此路径下执行上述命令)
  • pkg:golang编译包时生成的中间文件(比如:.a)。
  • bin:编译后生成的可执行文件(在项目内执行go install,会把执行文件安装到bin目录)(为了方便,可以把此目录加入到PATH变量中 , 如果有多个gopath,那么使用PATH变量中,如果有多个gopath,那么使用PATH变量中,如果有多个gopath,那么使用{GOPATH//?/bin:}/bin添加所有的bin目录
  1. 源码安装后的结果

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

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

归档文件存放的具体位置和规则:

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

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

github.com/labstack/echo,

执行命令:

go install github.com/labstack/echo

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

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

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

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

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

image.png

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

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

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

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

总结

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

Go 语言提供的很多工具都是在GOPATH 和工作区的基础上运行的,比如上面提到的go build、go install和go get,这三个命令也是我们最常用到的。

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

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

相关文章

完美的分布式监控系统——Prometheus(普罗米修斯)与优雅的开源可视化平台——Grafana(格鲁夫娜)

一、基本概念 1、之间的关系 prometheus与grafana之间是相辅相成的关系。作为完美的分布式监控系统的Prometheus,就想布加迪威龙一样示例和动力强劲。在猛的车也少不了仪表盘来观察。于是优雅的可视化平台Grafana出现了。 简而言之Grafana作为可视化的平台&#xff…

在excel调用SAP函数执行SAP数据查找或提交

1、下载插件 2、安装插件 3、执行函数 3.1 第一步 通过SAPRegister连接SAP服务器 var reg SAPRegister("10.10.14.15", "00", "mes", "AQ123456", "800") 需要改为实际的连接信息 "10.10.14.15" 为SAP服务器I…

嘉楠勘智k230开发板上手记录(三)--K230_RVV实战

按照K230_RVV实战.md操作 在k230_sdk目录下运行,Makefile里默认的toolchain路径是在/opt下的,需要拷贝过去 cp -r toolchain /opt/ make rt-smart-apps 进入目录 src/big/rt-smart 运行脚本 source smart-env.sh riscv64 配置环境变量 source smart-e…

随着野火的增加,甲烷排放也会增加

2020 年对加利福尼亚州造成严重破坏的野火使大气中充满了强效温室气体。 2020 年,溪火烧毁了北加州的内华达山脉。图片来源:Zachary Cava/Flickr,CC BY-NC-SA 2.0 2020 年,在高温和干旱的推动下,加州野火烧毁了超过160…

Verilog求log10和log2近似

Verilog求log10和log2近似 Verilog求10对数近似方法,整数部分用位置index代替,小数部分用查找表实现 参考: Verilog写一个对数计算模块Log2(x) FPGA实现对数log2和10*log10

56从零开始学Java之与字符串相关的正则表达式

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中,壹哥给大家介绍了String字符串及其各种常用API方法,接下来壹哥…

Netty:ChannelHandler的两个生命周期监听事件方法:handlerAdded 和 handlerRemoved

说明 io.netty.channel.ChannelHandler有两个生命周期监听事件方法: handlerAdded(ChannelHandlerContext ctx):当ChannelHandler被添加到实际的上下文、并且已经准备就绪等待处理事件的时候被调用。 handlerRemoved(ChannelHandlerContext ctx)&#…

SQL-每日一题【1179. 重新格式化部门表】

题目 部门表 Department: 编写一个 SQL 查询来重新格式化表,使得新的表中有一个部门 id 列和一些对应 每个月 的收入(revenue)列。 查询结果格式如下面的示例所示: 解题思路 1.题目要求我们重新格式化表,…

C++入门篇6 C++的内存管理

在学习C的内存管理之前,我们先来回顾一下C语言中动态内存 int main() {int* p1 (int*)malloc(sizeof(int));free(p1);// 1.malloc/calloc/realloc的区别是什么?int* p2 (int*)calloc(4, sizeof(int));//calloc 可以初始化空间为0int* p3 (int*)reall…

自动驾驶国家新一代人工智能开放创新平台产业化应用

【摘要】:当前,全球新一轮科技革命和产业变革正孕育兴起,自动驾驶作为人工智能最重要的应用载体之一,对于加快交通强国、智能汽车强国建设,具有十分突出的战略意义。我国自动驾驶研发应用,面临技术、资金、应用等诸多挑战,为此,需要打造一套符合我国国情的自动驾驶系统…

Android 13 Hotseat定制化修改——004 hotseat布局位置

目录 一.背景 二.原生hotseat布局位置 三.修改Hotseat布局位置 一.背景 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat…

SpringCloud实用篇1——eureka注册中心 Ribbon负载均衡原理 nacos注册中心

目录 1 微服务1.1 微服务的演变1.2 微服务1.3 SpringCloud1.4 小结 2 服务拆分及远程调用2.1 服务拆分2.2 服务拆分案例2.3 实现远程调用2.4 提供者与消费者 3 Eureka注册中心3.1 Eureka的结构和作用3.2 搭建eureka-server3.3 服务注册3.4 服务发现 4 Ribbon负载均衡4.1 负载均…

springboot学习(八十四) 解决springboot中使用Redis缓存,java.time.LocalDatetime类型无法序列化的问题

1、方式一:添加全局配置 配置方式参考前文:https://blog.csdn.net/u011943534/article/details/129164025 修改函数:getRedisCacheConfigurationWithTtl 添加两行配置: // 处理java.time下无法序列化的问题om.disable(Serializa…

Java自定义注解

Java自定义注解 一、Java自定注解 定义注解 package com.cloud.sample.base.annotation;import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annot…

安全杂记 - Linux文本三剑客之awk

目录 1.什么是AWK2.正则表达式3.语法4.内置变量示例printf命令5.复现awk经典实例(1).插入几个新字段(2).格式化空白(3).筛选IPv4地址(4).筛选给定时间范围内的日志 1.什么是AWK awk、grep、sed是linux操作文本的三大利器,合称文本三剑客。三者的功能都是处理文本&a…

【云原生】Yaml文件详解

目录 一、YAML 语法格式1.1查看 api 资源版本标签1.2 写一个yaml文件demo1.3 详解k8s中的port 一、YAML 语法格式 Kubernetes 支持 YAML 和 JSON 格式管理资源对象JSON 格式:主要用于 api 接口之间消息的传递YAML格式:用于配置和管理,YAML 是…

基于DETR (DEtection TRansformer)开发构建MSTAR雷达影像目标检测系统

关于DETR相关的实践在之前的文章中很详细地介绍过,感兴趣的话可以自行移步阅读即可: 《DETR (DEtection TRansformer)基于自建数据集开发构建目标检测模型超详细教程》 《书接上文——DETR评估可视化》 基于MSTAR雷达影像数据开发构建目标检测系统&am…

CentOS虚拟机更改屏幕锁屏时间

(1)点击“应用程序”,再点击“系统工具”,再点击“设置” (2) (3)在“设置”中点击“Privacy”,点击“锁屏”

免费实用的日记应用:Day One for Mac中文版

Day One for Mac是一款运行在Mac平台上的日记软件,你可以使用Day One for mac通过快速菜单栏条目、提醒系统和鼓舞人心的信息来编写更多内容,day one mac版还支持Dropbox同步功能,想要day one mac中文免费版的朋友赶紧来试试吧! …

hive 字段注释乱码

hive 字段注释乱码: 在mysql中运行: alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;OK