【Golang】关于Go语言中的包

news/2024/12/22 20:19:08/

在这里插入图片描述

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

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

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,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 myinitimport "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 secondinitimport _ "jingtian/的初始化/myinit"

在这里插入图片描述

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

2. 执行顺序流程图

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


http://www.ppmy.cn/news/1531496.html

相关文章

从供应链切入,0Day打穿靶标的全流程实战

前言 整体的思路梳理: 1.对某靶标单位信息收集, 发现靶标某个站点系统为通用系统。 2.对该通用系统供应商进行信息收集。 3.拿下该供应商CICD系统, 从而得到目标通用系统源码。 4.代码审计, 组合拳0day成功进入靶标内网。…

项目实战总结-Kafka实战应用核心要点

Kafka实战应用核心要点 一、前言二、Kafka避免重复消费2.1 消费者组机制2.2 幂等生产者2.3 事务性生产者/消费者2.4 手动提交偏移量2.5 外部存储管理偏移量2.6 去重逻辑2.7 幂等消息处理逻辑2.8 小结 三、Kafka持久化策略3.1 持久化文件3.2 segment 分段策略3.3 数据文件刷盘策…

ip是可以从能够上网的设备提取吗

是的,IP地址可以从能够上网的设备提取。以下是如何从不同设备提取IP地址的具体方法: 在电脑上提取IP地址 Windows: 打开命令提示符(按下 Win R,输入 cmd,按回车)。 输入命令 ipconfig,按回车。…

【分布式微服务云原生】Dockerfile命令详解

Dockerfile 是一个文本文件,它包含了一系列的指令,用于构建一个 Docker 镜像。下面是 Dockerfile 中常用命令的详细解释和示例。 1. 获取镜像的三种方式 通过命令拉取镜像 docker pull 镜像名称从镜像仓库拉取指定的镜像。 通过容器创建镜像 docker…

Mybatis(进阶部分)

四 Mybatis完成CURD(二) 4.5 多条件CRUD 之前的案例中,接口里方法的形参个数都是1个;如果方法形参是两个或者两个以上时,MyBatis又该如何获取获取参数呢? Mybatis提供了好几种方式,可以获取多…

Lenovo SR850服务器亮黄灯维修和升级CPU扩展模块

佛山市三水区某高校1台Lenovo Thinksystem SR850服务器黄灯故障到现场检修 和 升级3号和4号CPU。加强服务器的计算性能; 故障情况是该学校it管理员这一天看到这台SR850服务器前面板亮了一个黄灯,但是目前系统运行正常,出于安全考虑&#xff0…

Redis 五大基本数据类型及其应用场景进阶(缓存预热、雪崩 、穿透 、击穿)

Redis 数据类型及其应用场景 Redis 是什么? Redis是一个使用C语言编写的高性能的基于内存的非关系型数据库,基于Key/Value结构存储数据,通常用来 缓解高并发场景下对某一资源的频繁请求 ,减轻数据库的压力。它支持多种数据类型,如字符串、…

T8:猫狗识别

T8周:猫狗识别 **一、前期工作**1.设置GPU,导入库2.导入数据3.查看数据 **二、数据预处理**1.加载数据2.可视化数据3.配置数据集 **三、构建CNN网络模型****四、编译模型****五、训练模型****六、模型评估****七、预测**八、总结1、[train_on_batch 和 test_on_batc…