【Hello Go】Go语言工程管理

工程管理

    • 工作区
      • 工作区介绍
      • GOPATH设置
      • 自定义包
      • main包
      • main函数和init函数
      • 导入包
      • 点操作
      • 别名操作
      • _操作
    • 测试案例
      • GOPATH配置
      • go install使用

在我们实际的工作中 直接运用到编译器进行编译链接的场景少之又少

这是因为 在工程中不会只有一个源文件 并且源文件之间也有着相互依赖的关系 如果我们此时一个源文件一个源文件的进行编译 那么效率肯定是很差的

早期的Go语言使用了makefile作为工具 直到Go1发布的时候引入了Go命令行工具


Go命令行的革命性之处就在于它彻底消除了工程文件的概念 它使用目录结构和包名来推导工程结构和构建顺序

我们下面会使用一个接近现实的虚拟项目来演示Go的工程管理

工作区

工作区介绍

Go的代码必须放在工作区中

工作区其实就是一个对应特定工程的目录 它还应该包含三个子目录 src pkg bin

  • src目录 : 以代码包的形式组织并保存Go的源码文件
  • pkg目录 : 用于存放由go install构建安装后代码包的归档文件
  • bin目录 : 和pkg目录类似 通过go install命令安装后 保存由Go命令源码文件生成的可执行文件

目录src用于包含所有的源代码 是Go命令行工具一个强制的规则 而pkg和bin无需手动创建 (当然你自己非要手动创建也行 )

需要特别注意的是 只有当环境变量GOPATH中只包含一个工作区的目录路径时 go install指令才会把可执行文件放到bin目录下

若环境变量 GOPATH 中包含多个工作区的目录路径 像这样执行 go install 命令就会失效 此时必须设置环境变量 GOBIN

GOPATH设置

为了能够构建这个项目 我们首先需要将工程的根目录放到GOPATH中 否则 即使处于同一工作区 代码之间也无法通过绝对包路径完成调用


在我们的实际开发环境中 工作目录往往有多个

这些目录都要被配置到GOPATH中 在有多个工作目录的时候 我们需要注意下面几点

  • Windows操作系统下的分隔符是;
  • Linux操作系统下的分隔符是:
  • 当有多个GOPATH时 会将go get内容放在第一个工作目录下

所有的Go语言程序都会组成若干组文件 每一组文件被称为是一个包

这样子做有个好处就是 每个包都能作为一个最小的复用单元 被其他项目引用


一个包的源代码通常保存在一个或多个以 .go 为后缀的源文件中

通常来说一个包所在的目录路径的后缀就是包名

自定义包

对于一个较大的应用程序来说 我们应该将它按照功能进行分割成一个个低耦合的单元

我们创建的自定义包最好是放在GOPATH的src路径下

在Go语言中 一个包中的原文件名可以使任意的 但是他们都必须在第一行声明自己所属的包

package main

包中的成员以首字母来作为访问权限

  • public 首字母大写 可以被包外访问
  • private 首字母小写 不可以被包外访问

main包

在Go语言中 命名为main的包有特殊的含义 – Go语言的编译程序会试图把叫这种名字的包编译成一个二进制可执行程序

  • 所有的Go语言可执行程序都必须要有一个main包
  • 一个可执行程序有且只有一个main包

当编译器发现某个包的名字main的时候 它会查找该包中是否有mian函数 如果没有则不会编译 mian函数是整个程序的入口

main函数和init函数

Go语言中有两个保留的函数

  • init函数
  • main函数

他们定义的时候都没有参数和返回值

但是init函数定义多个 (但是官方文档中建议我们为了代码的可读性只定义一个

init函数 顾名思义 初始化函数 init函数会在main函数之前被调用 做好初始化工作


程序的初始化和执行都依赖于main包 如果main包中还导入了其他包 那么就会在编译时将他们依次导入

如果说有多个包导入了同一个包 那么这个包也只会导入一次

当一个A包中导入了B包时 如果说B包中还导入了C包 那么就会先将C包导入进来

下面的这张图很好的解释了包的导入关系

在这里插入图片描述

导入包

我们可以使用import关键字来导入包 它会告诉编译器你想引用该包内的代码

我们既可以使用相对路径也可以使用绝对路径 只不过如果要使用相对路径的话 我们要先配置好GOPATH环境变量

这部分和Linux的环境变量类似 如果感兴趣的同学可以参考我的这篇博客

Linux环境变量

标准库中的包会在安装 Go 的位置找到 Go 开发者创建的包会在 GOPATH 环境变量指定的目录里查找 GOPATH 指定的这些目录就是开发者的个人工作空间

如果编译器查遍 GOPATH 也没有找到要导入的包 那么在试图对程序执行 run 或者 build的时候就会出错

如果我们导入了一个包 我们就必须要使用包内的一部分代码 否则编译期间就会报错

点操作

如果说我们在导入包的时候在前面加上了一个点 这就表示我们下面使用该包的时候不需要制定包名

使用示例如下

package mainimport . "fmt"func main()  {Println("test")
}

别名操作

我们可以对包取别名 来防止重名 具体代码如下

package mainimport io "fmt"func main()  {io.Println("test")
}

_操作

有时候我们只想要导入一个包 但是不想要使用里面的函数 此时我们就可以使用_操作来实现

package mainimport _ "fmt"

此时如果我们就无法使用该包内的函数了

测试案例

我们在Linux centos7.6 环境下进行测试

工作目录的组织如下

在这里插入图片描述

其中 main.go 和 clac.go 的代码组织如下

在这里插入图片描述

在这里插入图片描述

GOPATH配置

在Windows的配置中 (以windows 11版本为例子)

我们可以先找到此电脑

在这里插入图片描述
右键属性 进入该界面

在这里插入图片描述

之后搜索栏中搜索环境变量
在这里插入图片描述

之后找到该设置

在这里插入图片描述
最后新建环境变量GOPATH即可

在这里插入图片描述

Linux的配置就简单多了

我们可以直接使用下面的指令来配置

export + GOPATH= 路径

设置完毕后如下图

在这里插入图片描述

之后我们只需要使用go build指令就会生成一个可执行文件src

在这里插入图片描述

go install使用

设置环境变量GOBIN

指令如下

export GObin= 路径(每个人路径不同)

在这里插入图片描述

之后我们在src目录下敲下go install指令 即可完成项目构建

在这里插入图片描述

可能由于Go版本不同 每个人的构建有所不同 大家要注意下自己的版本号

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

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

相关文章

数据科学家应该知道的 10 个高级深度学习架构!

一、介绍 跟上深度学习的最新进展变得非常困难。几乎每天都会出现深度学习的新创新或新应用。然而,这些进步大部分都隐藏在 ArXiv / Springer 等媒体上发表的大量研究论文中。 本文包含深度学习的一些最新进展以及 keras 库中的实现代码。我还提供了…

浙大恩特客户资源管理系统CustomerAction.entphone;.js 接口任意文件上传漏洞复现 [附POC]

文章目录 浙大恩特客户资源管理系统CustomerAction.entphone;.js 接口任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 浙大恩特客户资源管理系统CustomerAction.entphone;.js 接口任…

Apache Doris (五十四): Doris Join类型 - Bucket Shuffle Join

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

【测试功能篇 01】Jmeter 压测接口最大并发量、吞吐量、TPS

压力测试,我们针对比较关键的接口,可以进行相应的压力测试,主要还是测试看看接口能抗住多少的请求数,TPS稳定在多少,也就是吞吐量多少 安装 Jmeter的安装很简单,官网下载地址 http://jmeter.apache.org/ &…

笔记53:torch.nn.rnn() 函数详解

参数解释: (1)input_size():即输入信息 Xt 的每个序列的独热编码向量的长度,即 len(vocab) (2)hidden_size():即隐变量 h 的维度(维度是多少,就代表用几个数…

go语言学习之旅之Go语言数据类型

学无止境,今天学习Go 语言数据类型 Go(或Golang)是一种静态类型语言,这意味着变量的数据类型必须显式声明,并且在运行时不能更改。以下是Go中的一些基本数据类型: 这里仅介绍最常用的类型 数值类型: int: …

实在智能携手中国电信翼支付,全球首款Agent智能体亮相2023数字科技生态大会

11月10日-13日,中国电信与广东省人民政府联合主办的“2023数字科技生态大会”在广州隆重举行。本届大会以“数字科技焕新启航”为主题,邀请众多生态合作伙伴全方位展示数字科技新成果,包括数字新消费、产业数字化、智能电子、人工智能大模型等…

CentOS to 浪潮信息 KeyarchOS 迁移体验与优化建议

浪潮信息KeyarchOS简介 KeyarchOS即云峦操作系统(简称KOS), 是浪潮信息研发的一款面向政企、金融等企业级用户的 Linux 服务器操作系统。它基于Linux内核、龙蜥等开源技术,支持x86、ARM 等主流架构处理器,其稳定性、安全性、兼容性和性能等核心能力均已…

软件质量保护与测试(第2版)学习总结第十三章 集成测试

很多人都认为微软是一家软件开发公司,事实上我们是一家软件测试公司。 ---比尔盖茨 集成测试是在单元测试的基础上将多个模块组合在一起进行测试的过程。 13.1.1 区别 单元测试主要关注模块内部,系统测试则是在用户的角度来评价系统&#xff…

万宾科技智能井盖传感器,提升市政井盖健康

市政井盖就是城市里不可或缺的基础设施之一,关于它的监测工作可马虎不得。它承载着保护市民的交通安全以及城市正常运转的重要使命。虽然现在城市化的速度很快,但是传统的市政井盖管理方式变得有些力不从心了。井盖的覆盖范围很广,如果单单依…

飞熊领鲜参加「第十届中国产业数字化大会」获创新企业数字化百强

11月16日至17日,托比网“第十届中国(南京)产业数字化大会”在南京举行。作为“中国(南京)电子商务大会”的一部分,本次会议由江苏省商务厅、南京市人民政府指导,南京市商务局、南京市鼓楼区人民…

Android设计模式--原型模式

一,定义 原型模式就是用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象 也就是说用户从一个实例中复制出一个内部属性一致的对象,这个被复制的对象就是原型。 原型模式多用于创建复杂的或者构造耗时的实例,因为这…

Flutter的Widget, Element, RenderObject的关系

在Flutter中,Widget,Element和RenderObject是三个核心的概念,它们共同构成了Flutter的渲染流程和组件树的基础。下面简要介绍它们之间的关系: 1.Widget Widget是Flutter应用中的基础构建块,是一个配置的描述&#xf…

《向量数据库指南》——TruLens + Milvus Cloud构建RAG深入了解性能

深入了解性能 索引类型 本例中,索引类型对查询速度、token 用量或评估没有明显影响。这可能是因为数据量较小的关系。索引类型对较大语料库可能更重要。 Embedding 模型 text-embedding-ada-002 在准确性(0.72,平均 0.60)和答案相关度(0.82,平均0.62)上优于 MiniLM Embeddin…

数组两种初始化方法

1.数组的静态初始化 静态初始化即在初始化数组时即规定了数组的大小以及数组中每个元素的值 有三种静态初始化的方法: 以初始化一个int类型的数组为例: 1.数组类型[] 数组名 new 数组类型[]{元素1,元素2...元素n}; int[] a new int[]{1,3,5}; 2.数…

JavaEE初阶 01 计算机是如何工作的

前言 今天开始进行对JavaEE的一些基本总结,希望大家能在阅读中有所收获,如有错误还望多多指正. 1.冯诺依曼体系结构 这个体系结构相信学计算机的同学都不陌生,但是你真的知道这个体系结构说的是什么嘛?请听我娓娓道来.首先我先给出一张冯诺依曼体系结构的简图 你可以理解为当前…

ROS话题(Topic)通信:自定义msg - 例程与讲解

在 ROS 通信协议中,数据是以约定好的结构传输的,即数据类型,比如Topic使用的msg,Service使用的srv,ROS 中的 std_msgs 封装了一些原生的数据类型,比如:Bool、Char、Float32、Int64、String等&am…

轻地图+数据闭环加速落地,觉非科技获多家头部车企定点

‍作者 |张祥威 编辑 |德新 智能驾驶日益普及,「轻地图」和「数据闭环」成为各家能力比拼的关键,车企对此的需求也逐渐迫切。 11月16日,觉非科技宣布已与多家头部主机厂达成量产定点合作,围绕轻地图与数据闭环服务,支…

RabbitMQ-高级篇-黑马程序员

代码: 链接: https://pan.baidu.com/s/1nQBIgB_SbzoKu_XMWZ3JoA?pwdaeoe 提取码:aeoe 在昨天的练习作业中,我们改造了余额支付功能,在支付成功后利用RabbitMQ通知交易服务,更新业务订单状态为已支付。 但…