【Golang】关于Go语言中的包

news2024/10/2 1:33:20

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Go语言中的包
    • 1. 包的定义
    • 2. 包的可见性
    • 3. go语言main包和package介绍
    • 4. 常见的导包方式
      • 1、批量导入包
      • 2、相对路径导入包 ../ 上一级
      • 3、如果包名冲突,解决办法。
    • 5. 包的初始化
      • 1. init函数的执行顺序问题
      • 2. 执行顺序流程图

Go语言中的包

在Go语言中,包(Package)是组织和管理代码的基本单元。通过合理地使用包,我们可以提高代码的复用性、可维护性和可读性。

1. 包的定义

Go语言中包的本质:文件夹,不同的文件夹可以存放不同的功能代码。

在Go语言中,每个源代码文件都必须属于一个包。包通常由一个或多个以.go为后缀的源文件组成,这些源文件通常存放在同一个目录下。
包的名称应该具有描述性,能够清楚地表达其功能。包名一般使用小写字母,并且和包所在的文件夹名保持一致。

2. 包的可见性

Go语言使用大小写来控制代码的可见性。以大写字母开头的标识符(变量、函数、类型等)可以被其他包导入并使用,称为导出的标识符;而以小写字母开头的标识符只能在当前包内部使用,称为私有的标识符。

创建一个新的包
首先,我们需要创建一个新的目录来存放包的文件。目录的名称即为包的名称。然后,在该目录下编写相应的.go文件,并在文件的第一行使用package关键字声明该文件的包名。

3. go语言main包和package介绍

main包

1、main函数所在的包,必须是main包。代表程序的入口。整个项目只能有一个main函数,否则在main函数里面右键build项目的时候会报错

2、main包中引入其他包 ,import “fmt”

3、main是程序的入口,其他包不能使用,尽量使用网址作为包名。
4、不建议自己定义一个main文件夹用来存放main.go 一般main.go 以文件方式放到程序的工作目录。不建议其他包使用main文件夹

package

src:保存我们项目的源码路径,所有的代码都用包的形式放在这里。

package 声明包在哪里,不需要和文件夹名一致,但是我们尽量使用文件夹的名字。

1、一个目录下所有的go文件的用package指定的包名必须同名。

2、package指定的包名可以和文件夹不同名,但不建议这么写。

3、同一个包下的所有go文件的函数,可以直接调用。

4、导入包的时候,除了系统自带的包,导入我们自己写的包要从goworks目录下的src去写。

5、对于外包中的函数,我们需要使用我们导入的包名.函数名来使用。如果当前包的函数或者字段要给外面的包使用,首字母必须大写。

user.go中的UpdateUser函数要给userService.go中使用
在这里插入图片描述

导包调用
在这里插入图片描述

我们看下我们安装的go
也包含src pkg bin等文件夹
在这里插入图片描述

bin下就是我们执行go gofmt命令的可执行文件
在这里插入图片描述

src下就是go语言的源码包
在这里插入图片描述

作为对比,我们写的代码就在GOPATH=F:\goworks 设置的goworks目录下的src目录下
在这里插入图片描述

4. 常见的导包方式

1、批量导入包

import(
    // 系统包
    ""
    
    // 自己写的包 ..
    ""
    
    // 网上下载的包 github...
    ""
)

2、相对路径导入包 …/ 上一级

import "../xxx" // 不建议这样用

3、如果包名冲突,解决办法。

  1. 可以给包起别名,在包的前面给个字段就是起别名
  2. 简便模式:导入包里面的函数,前面加个点. 可以直接调用该包下的函数,不需要通过包名。
  3. 匿名导入,在导入的包前面加 _ 只会执行这个包下所有的init方法
package service

// 包
//
//import "math/rand"  // 随机数生成

import (
    //R "math/rand" // 可以给包起别名,在包的前面给个字段就是起别名
    //. "math/rand" // 简便模式:导入包里面的函数,前面加个点. 可以直接调用该包下的函数,不需要通过包名。
    _ "math/rand" // 匿名导入,在导入的包前面加 _ 只会执行这个包下的init方法
)

func test() {

}

5. 包的初始化

在Go语言中,每个包在被导入时,其中的全局变量以及init函数(如果有的话)会被自动执行。init函数的作用类似于构造函数,用于执行一些初始化操作。

要匿名导入 _ “math/rand” // 匿名导入,只会执行这个包下的init方法

Go语言中,除了main函数入口以外,还有一个十分特别的函数 init()函数。

init:初始化,在main方法执行之前执行

init:设置一些包… 初始化一些全局变量… 建立一些第三方的连接(数据库连接)、注册、检查、修复程序状态。

init 函数可以有多个,在同一个go文件中可以重名。

init 函数不需要传入参数,也没有返回值,任何地方不能调用 init()
init() 函数不能使用延迟函数 defer

init() 函数的用途:

初始化包或模块的全局变量。
注册自定义函数或类型。
执行其他初始化操作。

1. init函数的执行顺序问题

匿名导入包,会执行包下所有go文件的 init 函数, 单个init被多个地方导入,只会执行一次
1、先执行导入包的init函数,单个go文件中是顺序执行的,所有go中的init函数执行完毕后,才会到main包
2、如果导入了多个匿名包,按照main中导入包的顺序来进行执行。
3、在同一个包下的go文件如果有多个,都有init的情况下,按照文件从上到下排放顺序来执行对应的init函数()

代码展示
main.go

package main

//匿名导入
import (
    "fmt"
    _ "jingtian/包的初始化/myinit"
    _ "jingtian/包的初始化/secondinit"
)

func init() {
    fmt.Println("main---init")

}

func main() {
    // init 函数不需要传入参数,也没有返回值,任何地方不能调用 init()
    //init()

}

在这里插入图片描述

a.go

package myinit

import "fmt"

// 匿名导入包,会执行报下所有go文件的 init 函数, 单个init被多个地方导入,只会执行一次
// 1、先执行导入包的init函数,单个go文件中是顺序执行的,所有go中的init函数执行完毕后,才会到main包
// 2、如果导入了多个匿名包,按照main中导入包的顺序来进行执行。
// 3、在同一个包下的go文件如果有多个,都有init的情况下,按照文件排放顺序来执行对应的init函数()
func init() {
    fmt.Println("a--init1")
}

func init() {
    fmt.Println("a--init2")
}

func init() {
    fmt.Println("a--init3")
}

在这里插入图片描述

b.go

package secondinit

import _ "jingtian/包的初始化/myinit"

在这里插入图片描述

运行main,可以看到虽然myinit在main.go 和 b.go中都有导入,但是只执行了一次
而且是先执行完导入的包里面的init函数,然后才执行main里面的init函数
在这里插入图片描述

2. 执行顺序流程图

被依赖的包的init()函数会先于依赖它的包的init()函数执行。
在这里插入图片描述

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

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

相关文章

Oracle架构之数据库备份和RAC介绍

文章目录 1 数据库备份1.1 数据库备份分类1.1.1 逻辑备份与物理备份1.1.2 完全备份/差异备份/增量备份 1.2 Oracle 逻辑备份1.2.1 EXP/IMP1.2.1.1 EXP导出1.2.1.2 EXP关键字说明1.2.1.3 导入1.2.1.4 IMP关键字说明 1.2.2 EXPDP/IMPDP1.2.2.1 数据泵介绍1.2.2.2 数据泵的使用 1.…

【Android 源码分析】Activity生命周期之onPause

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

Linux操作常用问题

目录 Ubuntu操作问题vi编辑方向键键盘乱码回退键不能使用的问题解决问题的方法 Ubuntu操作问题 vi编辑方向键键盘乱码回退键不能使用的问题 编辑/etc/systemd/resolved.conf文件来修改DNS,结果编辑时键盘乱码,按下方向键会出现ABCD,且回退键…

解决json格式转换被特殊字符截断问题

SyntaxError:Unexpected end of JSON input 当我们使用navigateTo跳转传参的时候,在小程序中需要先转换为json字符串的格式化,但是如果我们传递的参数中有特殊字符的?/&amp的话,可能导致字符串被截断,此…

手搓游戏 —— 生成式 AI 助手 Amazon Q Developer 初体验

文章目录 一、Amazon Q介绍二、实验环境准备2.1 下载项目安装包2.2 验证 Python 环境2.3 安装Amazon Q扩展2.4 授权Builder ID 三、Amazon Q 快速理解main.py四、Amazon Q快速梳理控制器逻辑五、启动像素沙盒开放世界程序六、在 update() 中实现传送功能七、定位并修复代码漏洞…

【无人机设计与技术】自抗扰控制(ADRC)的建模与仿真研究

摘要 本文针对四旋翼无人机姿态控制系统进行了基于自抗扰控制(ADRC)的建模与仿真研究。通过MATLAB/Simulink仿真平台,实现了无人机的姿态控制模型,并采用自抗扰控制器(ADRC)对无人机的姿态进行控制。本文详细介绍了自抗扰控制器的设计方法和应用&#x…

机器学习模型评估

前言 承接上篇讲述了机器学习有哪些常见的模型算法,以及适用的场景,本篇将继续讲述如何评估模型。模型评估的目的是选出泛化能力强的模型。泛化能力强表示模型能很好地适用于未知的样本,模型的错误率低、精度高。本文将从评估方法和评估指标…

【开源鸿蒙】OpenHarmony 5.0.0 发布了,速来下载最新代码

【开源鸿蒙】OpenHarmony 5.0.0 发布了,速来下载最新代码 一、写在前面二、准备命令工具三、配置用户信息四、下载OpenHarmony源码4.1 使用ssh协议下载(推荐)4.2 使用https协议下载 五、下载编译工具链六、参考链接 今天是9月30号&#xff0c…

20道面试题001

常考语法就是指针,指针与数组、指针与字符串、指针与结构体、指针与函数之间的关系与使用, 以上课为准,辅助《深度理解C指针》这本书。 1. 指针与数组 定义: 数组名在表达式中通常被视为指向数组首元素的指针。 访问元素: 可以通过指针访问数…

计算机网络:计算机网络概述:网络、互联网与因特网的区别

文章目录 网络、互联网与因特网的区别网络分类 互联网因特网基于 ISP 的多层次结构的互连网络因特网的标准化工作因特网管理机构因特网的组成 网络、互联网与因特网的区别 若干节点和链路互连形成网络,若干网络通过路由器互连形成互联网 互联网是全球范围内的网络…

PWM驱动LED呼吸灯

背景知识:TIM输出比较-CSDN博客 stm32f10x_tim.h函数 // *** OC是Output Compare输出比较函数 void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TI…

给Windows系统设置代理的操作方法

一、什么是代理 网络代理是一种特殊的网络服务,允许一个网络终端通过这个服务与另一个网络终端进行非直接的连接,而提供代理服务的电脑系统或其它类型的网络终端被称为代理服务器。 代理服务器是网络信息的中转站,代理服务器就像是一个很大的…

56. QTreeWidget的基本使用

1. 说明 在软件开发中会遇到将数据信息制作成一种树目录的形式进行展示,那么此时就可以借助QT提供的QTreeWidget控件来实现这种需求,本篇博客会做一个案例简要说明这个控件的基本使用方法,博客中代码能够实现的功能是将此项目代码所在文件夹中的内容展示出来,如下图所示:…

模式识别编程实践1:身高和/或体重数据进行性别分类

🌞欢迎莅临我的个人主页👈🏻这里是我专注于深度学习领域、用心分享知识精粹与智慧火花的独特角落!🍉 🌈如果大家喜欢文章,欢迎:关注🍷点赞👍🏻评论…

回溯大总结

目录 0、基础什么是回溯?回溯法解决的问题回溯模板 1、组合问题77. 组合216.组合总和III17. 电话号码的字母组合39. 组合总和:40.组合总和II 0、基础 什么是回溯? 回溯是一种穷举的搜索算法,并不是一个高效的算法,当…

高并发内存池(五):ThreadCache、CentralCache和PageCache的内存回收机制、阶段性代码展示和释放内存过程的调试

目录 ThreadCache的内存回收机制 补充内容1 补充内容2 补充内容3 补充内容4 ListTooLong函数的实现 CentralCache的内存回收机制 MapObjectToSpan函数的实现 ReleaseListToSpans函数的实现 PageCache的内存回收机制 补充内容1 补充内容2 ReleaseSpanToPageCache函…

【Spine】引入PhotoshopToSpine脚本

引入 右键Photoshop图标,选择属性 打开文件所在位置 找到目录下的\Presets\Scripts文件夹。 找到Spine目录下的\scripts\photoshop文件夹下的PhotoshopToSpine.jsx 复制它,丢到Photoshop刚才找的那个目录下。 使用 打开.psd文件,检查不要…

二叉树:总结篇!【需要掌握的二叉树技能都在这里啦】

文章目录 前言二叉树理论基础二叉树理论基础二叉树的遍历方式深度优先遍历广度优先遍历 N叉树的遍历方式求二叉树的属性二叉树:是否对称二叉树:求最大深度二叉树:求最小深度二叉树:求有多少个节点二叉树:是否平衡二叉树…

外贸财务软件精选,提升管理效率与精准度

ZohoBooks、QuickBooks等六款会计软件各具特色,支持多币种、国际化等功能,适合不同规模外贸企业。其中,ZohoBooks功能全面,QuickBooks操作简便,SageIntacct适合复杂业务,用友U8和金蝶K/3面向中大型企业&…

CommandLineRunner 和 ApplicationRunner

CommandLineRunner 和 ApplicationRunner 背景: 项目启动之前,预先加载数据。比如,权限容器、特殊用户数据等。通常我们可以使用监听器、事件来操作。但是,springboot提供了一个简单的方式来实现此类需求,即&#xf…