【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 main

import . "fmt"


func main()  {
	Println("test")
}

别名操作

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

package main

import io "fmt"


func main()  {
	io.Println("test")
}

_操作

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

package main

import _ "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版本不同 每个人的构建有所不同 大家要注意下自己的版本号

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

调试/抓包工具

一、Fiddler【推荐window使用】 介绍:个人认为是 Windows 平台最好用的抓包工具; 下载:Fiddler | Web Debugging Proxy and Troubleshooting Solutions 使用方式:这一篇文章写的很全,认真看完就够用了 Fiddler 抓包工…

FL Studio21.2最新版本支持终身免费更新

你是否体验过Tomorrowland现场万人蹦迪的的激情?又是否加入过“死墙(Mosh pit:一种Bass音乐节常有的娱乐方式)”的狂欢盛宴?随着时代发展,以电子音乐为代表的数字音乐已然象征着时尚与潮流。在这股风靡全球…

YB203H系列是一组CMOS技术实现的三端低功耗高电压稳压器

概述: YB203H系列是一组CMOS技术实现的三端低功耗高电压稳压器。输出电流为200mA且允许的输入电压可高达80V。具有几个固定的输出电压,范围从2.1V到12.0V.CMOS技术可确保其具有低压降和低静态电流的特性。最高耐压100W.尽管主要为固定电压调节器而设计,…

Mysql -常见函数

目录 字符串函数 数值函数 日期函数 流程函数 字符串函数 -- 拼接 SELECT CONCAT(Hello, World); -- 小写 SELECT LOWER(Hello); -- 大写 SELECT UPPER(Hello); -- 左填充 SELECT LPAD(01, 5, -); -- 右填充 SELECT RPAD(01, 5, -); -- 去除空格 SELECT TRIM( Hello World )…

群晖邮件设置,错误535 Authenticate failed问题

设置邮件通知或者报警很方便,群晖内部内置这个功能。在设置的时候遇到错误535 Error:authentication failed。 原因是:这个错误就是认证失败! 但是相信很多的同学明明用户名和密码填的是对的,就是说认证失败&#xf…

MATLAB中plotmatrix函数用法

目录 语法 说明 示例 使用两个矩阵输入创建散点图矩阵 使用一个矩阵输入创建散点图矩阵 指定标记类型和颜色 创建并修改散点图矩阵 plotmatrix函数的功能是创建散点图矩阵。 语法 plotmatrix(X,Y) plotmatrix(X) plotmatrix(___,LineSpec) plotmatrix(ax,___) [S,AX,B…

如何啟用 BitLocker來加密硬盤

概述 什麼是 BitLocker: BitLocker 磁碟機加密是一項本機安全性功能,可對安裝 Windows 的磁碟機上的所有內容進行加密。設備加密透過加密來幫助保護您的資料。只有擁有正確加密金鑰(例如個人識別碼)的人才能解密它。 它是如何運…

2.认识中台

1.数字化中台初步认识与建设策略 中台的定义 阿里对中台的定义: 中台是一个基础的理念和架构,我们要用中台的思想建设、联通所有基础服务,共同支持上端的业务。业务中台更多的是支持在线业务,数据中台则提供基础数据处理能力和很多的数据产…

C语言百钱买百鸡(ZZULIOJ1074:百钱买百鸡)

题目描述 百钱买百鸡问题:公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱,用100文钱买100只鸡,公鸡、母鸡、小鸡各买多少只? 本程序要求解的问题是:给定一个正整数n,用n文钱买n只鸡&…

跨境电商与文化多样性:市场中的机遇

在数字时代,跨境电商已经成为全球贸易的主要驱动力之一。随着互联网的普及和物流的改善,企业有机会将产品和服务推向全球市场。 然而,随着全球市场的扩大,文化多样性也成为了一个重要的考虑因素。本文将深入探讨跨境电商与文化多…

Wireshark 截取指定端口海量包分析

有个应用要分析一下协议,但是8939,8940传输一下子几个G的数据,但是要分析的端口8939实际上只有几个MB最多,如果用wireshark有界面的程序一截取就会卡死,于是使用命令行方式,截取指定端口的 tshark -i &quo…

AI先行者第三辑:石油专家正在加速“吸入”AI养分

AI对于石油行业而言,绝不是一个非此即彼、非黑即白、有用或者无用的简单命题,而是一个如何不断深入去提升效率,逐步证明自己价值的过程。 本篇作者安鹏,中国海洋石油集团有限公司信息技术中心 技术中台工程师;AICA首席…

【MyBatis】写了 10 年的代码,我最怕写 MyBatis 这些配置,现在有详解了

在使用 mybatis 过程中,当手写 JavaBean和XML 写的越来越多的时候,就越来越容意出错。这种重复性的工作,我们当然不希望做那么多。 还好, mybatis 为我们提供了强大的代码生成--MybatisGenerator。 通过简单的配置,我们…

【数据结构】图的简介(图的逻辑结构)

一.引例(哥尼斯堡七桥问题) 哥尼斯堡七桥问题是指在哥尼斯堡市(今属俄罗斯)的普雷格尔河(Pregel River)中,是否可以走遍每座桥一次且仅一次,最后回到起点的问题。这个问题被认为是图…

安全知识普及:什么是垃圾邮件和网络钓鱼欺诈

文章目录 什么是垃圾邮件?如何保护您自己免遭垃圾电子邮件和网络钓鱼侵害区分私人和公用电子邮件私人电子邮件公共电子邮件 使用反垃圾邮件过滤器推荐阅读 什么是垃圾邮件? 您的邮箱里经常会出现一些莫名其妙的邮件,而这就是电子形式的垃圾邮…

早晨暖心的早安问候语,祝好心情从清晨开始,愿你享受美好生活每一天!

1、冬天里,重调理;多锻炼,日光浴;早安睡,晚游历;勤开窗,通空气;暖腹背,寒不欺;适滋补,强体力;心乐观,无忧虑;温…

Java学习之路 —— 网络通信

文章目录 1. InetAddress2. UDP3. TCP4. 总结 1. InetAddress InetAddress的常用方法如下: public class InetAddressDemo {public static void main(String[] args) throws Exception{// 1. 获取本机IP地址对象InetAddress ip1 InetAddress.getLocalHost();Sys…

车间ERP管理系统都有哪些?能带给企业什么好处

不同规模的制造企业有不同的管理模式和经营策略,而生产和销售等业务是这类企业较为核心的部门,其中车间的管理是生产过程管理的重点环节之一。 车间的管理工作涉及物料、班组、设备、工时评估、生产现场数据采集、派工单、退补料等环节,如何…

2023年(第六届)电力机器人应用与创新发展论坛-核心PPT资料下载

一、峰会简介 大会以“聚焦电力机器人创新、助力行业数字化转型、促进产业链协同发展”为主题,展示电力机器人产业全景创新技术,探讨数字化战略下电力机器人应用前景和发展趋势。为加快推进电力机器人应用拓新,助力电网数字化转型升级&#…

吴恩达《机器学习》9-1:代价函数

一、引入新标记方法 首先,引入一些新的标记方法,以便更好地讨论神经网络的代价函数。考虑神经网络的训练样本,其中每个样本包含输入 x 和输出信号 y。我们用 L 表示神经网络的层数,表示每层的神经元个数(表示输出层神…