Go语言--工程管理、临时/永久设置GOPATH、main函数以及init函数

工作区

Go 代码必须放在工作区中。工作区其实就是一个对应于特定工程的目录,它应包含3个子目录:src 目录、pkg目录和bin 目录。

  • src 目录:用于以代码包的形式组织并保存 Go源码文件。(比如:.go.chs等)
  • pkg 目录:用于存放经由 go install 命令构建安装后的代码包(包含 Go 库源码文件)的“a”归档文件。
  • bin 目录:与pkg目录类似,在通过go install命令完成安装后,保存由Go命令源码文件生成的可执行文件。
    目录 src 用于包含所有的源代码,是 Go 命令行工具一个强制的规则,而 pkg 和 bi 则无需手动创建,如果必要Go命令行工具在构建过程中会自动创建这些目录。
    需要特别注意的是,只有当环境变量 GOPATH 中只包含一个工作区的目录路径时,go install命令才会把命令源码安装到当前工作区的 bin 目录下。若环境变量 GOPATH 中包含多个工作区的目录路径,像这样执行 go install 命令就会失效,此时必须设置环境变量 GOBIN。

GOPATH

为了能够构建这个工程,需要先把所需工程的根目录加入到环境变量 GOPATH 中。否则,即使处于同一工作目录(工作区),代码之间也无法通过绝对代码包路径完成调用。

在实际开发环境中,工作目录往往有多个。这些工作目录的目录路径都需要添加至 GOPATH。当有多个目录时,请注意分隔符,多个目录的时候 Windows是分号,Linux系统是冒号,当有多个 GOPATH时,默认会将go get 的内容放在第一个目录下。

配置GOPATH

在系统中配置

  • 通过在命令提示符中输入go env可以查看路径
    在这里插入图片描述
  • 在我的电脑,右击属性,高级系统设置
    在这里插入图片描述
  • 环境变量,新建一个
    在这里插入图片描述

临时GOPATH

在这里插入图片描述
在这里插入图片描述

所有 Go 语言的程序都会组织成若干组文件,每组文件被称为一个包。这样每个包的代码都可以作为很小的复用单元,被其他项目引用。
一个包的源代码保存在一个或多个以.go 为文件后缀名的源文件中,通常一个包所在目录路径的后缀是包的导入路径。

工程管理

同一目录下

  1. 分文件编程(多个源文件),必须放在src目录
  2. 设置GOPATH环境变量
  3. 同一个目录,包名必须一样
  4. go env査看go相关的环境路径
  5. 同一个目录,调用别的文件的函数,直接调用即可,无需包名引用、
    在这里插入图片描述

不同目录下

  1. 不同目录,包名不一样
  2. 调用不同包里面的函数,格式:包名.函数名()
  3. 要配置GOPATH
  4. 调用别的包的函数,这个包函数名字首字母如果是小写,无法让别人调用,要想让别人调用,必须首字母大写;

在这里插入图片描述

main函数

Go 里面有两个保留的函数:init函数(能够应用于所有的package)和main 函数(只能应用于 package main)。这两个函数在定义时不能有任何的参数和返回值。虽然一个 package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说,我们都强烈建议用户在一个 package中每个文件只写一个init函数。
Go 程序会自动调用 init0)和 main0,所以你不需要在任何地方调用这两个函数。每个 package中的 init 所数都是可选的,但 package main 就必须包含一个 main 系数。
每个包可以包含任意多个init函数,这些函数都会在程序执行开始的时候被调用。所有被编译器发现的init函数都会安排在 main 函数之前执行。init函数用在设置包、初始化变量或者其他要在程序运行前优先完成的引导工作。
程序的初始化和执行都起始于 main 包。如果 main 包还导入了其它的包,那么就会在编译时将它们依次导入。
有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到 fmt包,但它只会被导入一次,因为没有必要导入多次)。
当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开始对main 包中的包级常量和变量进行初始化,然后执行 main 包中的 init 函数(如果存在的话),最后执行 main 函数。下图详细地解释了整个执行过程:
在这里插入图片描述
在这里插入图片描述

导入包

  • 传统方法import "包" 导入包,导入后必须使用包名,然后.操作。例如fmt.Println("xxx"),否则编译失败。
  • 常用的
import ("fmt""os"
)
  • import . "fmt" 这样导入包,无需通过包名进行调用Println("xxx")
  • 给包名起别名 import io "fmt",通过别名进行调用io.Println("xxx")
  • 忽略此包 import _ "fmt" 通过_表明忽略此包。有时,用户可能需要导入一个包,但是不需要引用这个包的标识符。实际上是调用了该包里面的init 函数。

自定义包

对于一个较大的应用程序,我们应该将它的功能性分隔成逻辑的单元,分别在不同的包里实现。我们创建的的自定义包最好放在GOPATH的src目录下(或者GOPATHsrc的某个子目录)。
在 Go 语言中,代码包中的源码文件名可以是任意的。但是,这些任意名称的源码文件都必须以包声明语句作为文件中的第一行,每个包都对应一个独立的名字空间:
package calc
包中成员以名称首字母大小写决定访问权限:
public:首字母大写,可被包外访问
private:首字母小写,仅包内成员可以访问
注意:同一个目录下不能定义不同的package。

工程管理总结

  1. src放源代码
  2. 如果有多个文件或者多个包,要先配置GOPATH环境变量,即配置GOPATH=src同级目录的绝对路径
  3. 如果想自动生成bin以及plg目录,需要使用go install目录,除了要配置GOPATH环境变量,还要配置GOBIN环境变量。
  4. 最终src放源代码,bin放可执行程序,pkg放平台相关的库。

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

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

相关文章

芯片基识 | 掰开揉碎讲 FIFO(同步FIFO和异步FIFO)

文章目录 一、什么是FIFO二、为什么要用FIFO三、什么时候用FIFO四、FIFO分类五、同步FIFO1. 同步FIFO电路框图2. 同步FIFO空满判断3. 同步FIFO设计代码4. 同步FIFO仿真结果 六、异步FIFO1、异步FIFO的电路框图2 、亚稳态3、打两拍4、格雷码5、如何判断异步FIFO的空满&#xff0…

react v18 less使用(craco)

方案一、弹出配置(不推荐) 安装依赖:yarn add less less-loader 首先 执行 yarn eject 弹出配置项文件(注意:弹出配置不可逆!) 在 config 文件夹中 找到 webpack.config.js,在如图…

爆破片和安全阀

一、爆破片介绍 爆破片是一种用于安全释放压力的结构,通常应用于压力容器、管道和设备中,以防止由于压力过高而导致的灾难性故障。在压力超过设定值时,爆破片会破裂,从而迅速将过压泄放,保护设备和人员安全 爆破片通常…

java Web 优秀本科毕业论文系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 优秀本科毕业论文系统是一套完善的web设计系统,对理解JSP java serlvet 编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0&a…

Selenium的这些自动化测试技巧你知道几个?

Selenium自动化测试技巧 与以前瀑布式开发模式不同,现在软件测试人员具有使用自动化工具执行测试用例套件的优势,而以前,测试人员习惯于通过测试脚本执行来完成测试。 但自动化测试的目的不是完全摆脱手动测试,而是最大程度地减少…

24.【C语言】getchar putchar的使用

1.基本作用 用户输入字符,getchar()获取字符(含\n:即键入的Enter)(字符本质上是以ASCII值或EOF(-1)存储的)(与scanf有区别) putchar() 打印字符(把得到的A…

嵌入式系统中状态机实现详解

嵌入式开发中系统经常处于某种状态,如何处理呢?接下来分析一下,状态机的实现无非就是 3 个要素:状态、事件、响应。转换成具体的行为就 3 句话。 发生了什么事? 现在系统处在什么状态? 在这样的状态下发生了这样的事,系统要干什么? 用 C 语言实现状态机主要有 3 种方法…

LeetCode 60.排序排列(dfs暴力)

给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,并一一标记,当 n 3 时, 所有排列如下: "123""132""213""231""312""321" 给定…

机器学习——岭回归

1、岭回归与线性回归的区别 岭回归(Ridge Regression)和线性回归(Linear Regression)都是用于回归分析的统计方法,但它们在处理方式和应用场景上有一些关键的区别: a)基本概念 线性回归:目标是…

在pycharm里如何使用Jetbrains AI Assistant

ai assistant激活成功后,如图 ai assistant渠道:https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上,Google 为 Android Studio 推出了 Studio Bot 功能,使用了谷歌编码基础模型 Codey,Codey 是…

ABAP 发送正文含图片邮件

背景: 客户要求系统发送的邮件内容中含logo图片 解决: 参考outlook中带图片的邮件,有两种形式,一种为url链接,需要点击下载才展示图片,一种为直接显示;如果使用ABAP发送该类型的邮件&#xff0…

【密码学】RSA公钥加密算法

文章目录 RSA定义RSA加密与解密加密解密 生成密钥对一个例子密钥对生成加密解密 对RSA的攻击通过密文来求得明文通过暴力破解来找出D通过E和N求出D对N进行质因数分解通过推测p和q进行攻击 中间人攻击 一些思考公钥密码比对称密码的机密性更高?对称密码会消失&#x…

SQL使用join查询方式找出没有分类的电影id以及名称

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 现有电影信息…

分库分表真的适合你的系统吗?

曾几何时,“并发高就分库,数据大就分表”已经成了处理 MySQL 数据增长问题的圣经。 面试官喜欢问,博主喜欢写,候选人也喜欢背,似乎已经形成了一个闭环。 但你有没有思考过,分库分表真的适合你的系统吗&am…

QCustomPlot+ vs2022+ qt

零、printSupport 步骤一:下载QCustomPlot 访问QCustomPlot的官网 QCustomPlot 下载最新版本的源代码。 步骤二:配置项目 创建新的Qt项目: 打开VS2022,创建一个新的Qt Widgets Application项目。 将QCustomPlot源代码添加到项目…

场景管理分析平台介绍

在数字化浪潮的推动下,数据已成为企业决策的重要依据。特别是在智能驾驶、虚拟现实和物联网等领域,场景数据的高效管理和利用至关重要。在智能驾驶领域面对海量的场景数据,如何高效处理、精准分析,并将其转化为有价值的决策支持&a…

第一次作业

作业1 1.代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&…

玩转Easysearch语法

Elasticsearch 是一个基于Apache Lucene的开源分布式搜索和分析引擎&#xff0c;广泛应用于全文搜索、结构化搜索、分析等多种场景。 Easysearch 作为Elasticsearch 的国产化替代方案&#xff0c;不仅保持了与原生Elasticsearch 的高度兼容性&#xff0c;还在功能、性能、稳定性…

Maven 分模块设计与开发 继承

介绍 在 Maven 中进行分模块设计&#xff08;multi-module project&#xff09;&#xff0c;可以帮助将一个大型项目分解为更小、更易管理的模块。这种设计方式有助于提高项目的可维护性、复用性和团队协作效率。 继承关系 目录结构 引入父Maven 父坐标 在子项目中引入父亲…

第一百四十五节 Java数据类型教程 - Java字符串类型

Java数据类型教程 - Java字符串类型 零个或多个字符的序列称为字符串。 在Java程序中&#xff0c;字符串由java.lang.String类的对象表示。 String类是不可变的。 String对象的内容在创建后无法修改。 String类有两个伴随类&#xff0c;java.lang.StringBuilder和java.lang.…