【Hello Go】Go语言工程管理

news2024/12/22 17:34:18

工程管理

    • 工作区
      • 工作区介绍
      • 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版本不同 每个人的构建有所不同 大家要注意下自己的版本号

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

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

相关文章

java学习part05

43-流程控制-使用Scanner类从键盘获取数据_哔哩哔哩_bilibili 1.接收输入 步骤 例子 2.生成随机数 3.switch-case 4.for 5.while

IDEA插件下载到本地

IDEA插件下载到本地 官网下载【点击跳转】

基于DE10-Standard Cyclone V SoC FPGA学习---开发板简介

基于DE10-Standard Cyclone V SoC FPGA学习---开发板简介 简介产品规格基于 ARM 的 HPS配置与调试存储器件通讯连接头显示器音频视频输入模数转换器开关、按钮、指示器传感器电源 DE10-Standard 开发板系统框图Connect HTG 组件配置设计资源其他资源 简介 开发板资料 见 DE10-…

rv1126-rv1109-openssh

这是一个工具,可以通过ssh远程登录来操作,非常逆天! 于是rv1109代码自身自带有openssh 所以只需要打开config即可 diff --git a/buildroot/configs/rockchip_rv1126_rv1109_spi_nand_defconfig b/buildroot/configs/rockchip_rv1126_rv1109…

Pytorch plt.scatter()函数用法

一.scatter()函数的定义 matplotlib.pyplot.scatter(x, y, sNone, cNone, markerNone, cmapNone, normNone, vminNone, vmaxNone, alphaNone, linewidthsNone, vertsNone, edgecolorsNone, *, dataNone, **kwargs) 特征值作用x,y绘制散点图…

MAC电脑连接外接显示屏,颜色显示有问题,又粉、紫色蒙版,问题处理(1)

问题描述 买了一个显示器,想给mac做分屏使用,结果连上之后发现,整个屏幕像是被蒙上了一层紫色的蒙版。 就像下面展示的一样: 解决 将显示器颜色空间改为RGB颜色空间即可。 打开显示器菜单,找到颜色空间选项&#…

(六)什么是Vite——热更新时vite、webpack做了什么

vite分享ppt,感兴趣的可以下载: ​​​​​​​Vite分享、原理介绍ppt 什么是vite系列目录: (一)什么是Vite——vite介绍与使用-CSDN博客 (二)什么是Vite——Vite 和 Webpack 区别&#xff0…

2023数维杯数学建模C题完整版本

已经完成全部版本,获取请查看文末下方名片 摘要 随着人工智能在多个领域的快速发展,其在文本生成上的应用引起了广泛关注。本研究聚焦于辨识人工智能(AI)生成文本的基本规则,并探究AI文本的检测及其与人类文本的区分…

Boolean源码解剖学

原创/朱季谦 有天突发其想,想看一下Boolean底层都做了些什么,故而去看了一番Boolean的源码,基于一些思考的基础上,输出了这篇文章。 一.类继承 Boolean的源码类定义部分如下: 1 public final class Boolean implemen…

Cascade-MVSNet论文笔记

Cascade-MVSNet论文笔记 摘要1 立体匹配(Stereo Matching)2 多视图立体视觉(Multi-View Stereo)3 立体视觉和立体视觉的高分辨率输出4 代价体表达方式(Cost volume Formulation)4.1 多视图立体视觉的3D代价…

农户建档管理系统的设计与实现-计算机毕业设计源码20835

摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设农户建档管理系统。 本…

keepalived离线安装

上传离线安装包 将离线安装包拖动到服务器上 进入到离线安装包路径,执行下面脚本进行安装 rpm -Uvh --force --nodeps *.rpm

免费!IDEA插件推荐:Apipost-Helper

今天给大家推荐一款IDEA插件:Apipost-Helper-2.0,写完代码IDEA内一键生成API文档,无需安装、打开任何其他软件;写完代码IDEA内一键调试,无需安装、打开任何其他软件;生成API目录树,双击即可快速…

pythom导出mysql指定binlog文件

要求 要求本地有py环境和全局环境变量 先测试直接执行binlog命令执行命令 Windows 本地直接执行命令 # E:\output>E:\phpstudy_pro\Extensions\MySQL5.7.26\bin\mysqlbinlog binglog文件地址 # --no-defaults 不限制编码 # -h mysql链接地址 # -u mysql 链接名称 # -p m…

数据库学习 02-01 关系数据模型详细学习(数据库模式中的一种)

关系型数据模型的相关概念介绍: 01.关系(Relation) 一个关系对应通常说的一张表 02.元组(Tuple) 表中的一行即为一个元组,也就是一个对象 03.属性(Attribute) 表中的一列即为一个属性…

C语言日记——调试篇

一、调试调试的基本步骤 发现程序错误的存在 以隔离、消除等方式对错误进行定位 确定错误产生的原因 提出纠正错误的解决办法 对程序错误予以改正,重新测试 二、Debug和Release Debug通常称为调试版本,它包含调试信息,并且不作任何优化…

Android开发中集合之Collection和Collections集合

概要 提示:Android开发中有很多时候使用到集合,今天我们就来详细的了解一下Android开发中集合的种类 Collection接口 //返回这个集合是否为空 boolean isEmpty(); //添加一个单例到集合中 boolean add(E e); //将指定集合中的所有元素都添加到当前…

本周Github有趣项目:draw-a-ui等

有趣的项目、工具和库 gpt-crawler 抓取网站以生成知识文件,从而从 URL 创建您自己的自定义 GPT。 需要步骤: 配置运行爬虫、 将您的数据上传到 OpenAI:使用此选项通过 UI 访问您生成的知识,您可以轻松与他人共享 创建自定义助…

nginx学习(1)

一、下载安装NGINX: 先安装gcc-c编译器 yum install gcc-c yum install -y openssl openssl-devel(1)下载pcre-8.3.7.tar.gz 直接访问:http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz,就…

Unity中Shader纹理的过滤

文章目录 前言一、为什么要过滤?二、过滤方式1、Point(no filter) 无过滤2、Bilinear 双线性过滤3、Trilinear 三线性过滤 前言 Unity中Shader纹理的过滤 一、为什么要过滤? 事实上没有一个纹理上的纹素是与屏幕上的像素是一一对应的。 屏幕上的 一个…