【Go】七、包、init函数、匿名函数、闭包

文章目录

  • 1、包
  • 2、本质
  • 3、init函数
  • 4、匿名函数
  • 5、闭包

1、包

不同的包,不同的功能和业务,互相import
在这里插入图片描述

关于包:

package 包名

注意点:

  • 建议包名和所在文件夹同名

在这里插入图片描述

  • main函数一定要放在main包下,否则编译报错
go run:cannot run non-main package
  • 导入包是:
//从$GOPATH/src/后开始计算
import "包的路径"//一次性导入多个
import("fmt""gocode/testproject01/unit5/demo09/crm/dbutils"
)
  • 函数调用时定位到所在的包

在这里插入图片描述

在这里插入图片描述

  • 一个目录下,不能有重复的函数

在这里插入图片描述

  • 包名和文件夹的名字可以不一样。但同一个目录下的源文件,包名的声明必须一致。即你这个随便起了个aaa,那同文件夹下的其他go文件的包名也就是aaa了

在这里插入图片描述

  • 给包取别名后,原来的包名不可再使用

在这里插入图片描述

2、本质

go里面,包的实质:

  • 在程序层面,所有使用相同 package 包名 的源文件组成的代码模块
  • 在源文件层面就是一个文件夹

3、init函数

  • 包的初始化函数,做一些初始化操作
  • 每个go的源文件都可以包含一个init函数
  • init函数的执行,是在main函数被执行前,被Go自己的运行框架调用

在这里插入图片描述

  • 执行时机:全局变量的定义 > init函数 > main函数

在这里插入图片描述

  • 多个源文件都有init函数的时候,从main包的import开始,依次执行导入的包的init函数。当然,如果被导入的包里也有在导入别的包,那就像函数调用一样A ⇒ B ⇒ C ⇒ D ,D函数执行完再退回去 ⇒ C ⇒ B ⇒ A

在这里插入图片描述

4、匿名函数

如果某个函数只希望调用一次,可用go的匿名函数:

在这里插入图片描述

如上,再定义匿名函数的时候直接调用,如此就能保证匿名函数只被调用一次。如果需要被多次调用,可将匿名函数赋值给一个变量(但不常用了,想多次调可直接去定义个普通函数)

在这里插入图片描述

最后,如果想要一个匿名函数可以在整个函数中被调用,那就赋值给一个全局变量:

package main
import "fmt"var Func01 = func (num1 int,num2 int) int{return num1 * num2
}func main(){       result := Func01(3,4)fmt.Println(result)
}

5、闭包

闭包即一个函数和起引用的环境组合的一个整体。

package main
import "fmt"
//函数功能:求和
//函数的名字:getSum 参数为空
//getSum函数返回值为一个函数,这个函数的参数是一个int类型的参数,返回值也是int类型
func getSum() func (int) int {var sum int = 0return func (num int) int{sum = sum + num return sum}
}
//闭包:返回的匿名函数+匿名函数以外的变量num
func main(){f := getSum()fmt.Println(f(1))//1 fmt.Println(f(2))//3fmt.Println(f(3))//6fmt.Println(f(4))//10
}

运行:

1
3
6
10

可以看到匿名函数中用到了函数以外的变量sum,它两形成闭包。且 匿名函数中引用的那个变量会一直保存在内存中,可以一直使用

闭包本质依旧是一个匿名函数,只是这个函数引入外界的变量/参数

匿名函数+引用的变量/参数 = 闭包

闭包的特点:

  • 返回的是一个匿名函数,但是这个匿名函数引用到函数外的变量/参数 ,因此这个匿名函数就和变量/参数形成一个整体,构成闭包
  • 闭包中使用的变量/参数会一直保存在内存中,所以会一直使用 ⇒ 意味着闭包不可滥用(对内存消耗大)

闭包应用场景:闭包可以保留上次引用的某个值

Demo:

package main
import "fmt"
//函数功能:求和
//函数的名字:getSum 参数为空
//getSum函数返回值为一个函数,这个函数的参数是一个int类型的参数,返回值也是int类型
func getSum() func (int) int {var sum int = 0return func (num int) int{sum = sum + num return sum}
}
//闭包:返回的匿名函数+匿名函数以外的变量num
func main(){f := getSum()fmt.Println(f(1))//1 fmt.Println(f(2))//3fmt.Println(f(3))//6fmt.Println(f(4))//10fmt.Println("----------------------")//不用闭包fmt.Println(getSum01(0,1))//1fmt.Println(getSum01(1,2))//3fmt.Println(getSum01(3,3))//6fmt.Println(getSum01(6,4))//10
}func getSum01(sum int,num int) int{sum = sum + numreturn sum
}
//不使用闭包的时候:我想保留的值,不可以反复使用
//闭包应用场景:闭包可以保留上次引用的某个值,我们传入一次就可以反复使用了

如上,不用闭包,想达到和上面闭包一样去共用某个值,就很麻烦。

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

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

相关文章

IP归属地在互联网行业中的应用

摘要:IP(Internet Protocol)地址归属地是指互联网上某个IP地址所对应的地理位置信息。在互联网行业中,IP归属地具有重要的应用价值,包括网络安全、广告定向、用户定位等方面。IP数据云将探讨IP归属地在互联网行业中的应…

3d怎么两个模型连接圆润?---模大狮模型网

在3D建模中,如何实现两个3d模型的圆润连接是一个常见而又关键的问题。无论是为了美观的外观设计还是为了模型的功能性,圆润连接都能够增加模型的整体质感和流畅度。模大狮将介绍一些常见的方法和技巧,帮助您实现两个模型之间的圆润连接。 一、…

Linux如何连接github仓库

一.创建一个github账号 如何创建一个github账号 二.在github上创建一个仓库 登录上github后出现这个界面 然后点击左上角头像,在按照图片位置点击: 继续按照图片上的位置进行点击: 创建成功: 三.云主机连接Github仓库 1.在linux中…

深度学习-计算机视觉入门-part1

计算机视觉入门 文章目录 计算机视觉入门一、 从卷积到卷积神经网络1.图像的基本表示2. 卷积操作3.卷积遇见深度学习3.1 通过学习寻找卷积核3.2 参数共享:卷积带来参数量骤减3.3 稀疏交互:获取更深入的特征 二、手撕卷积代码三、经典CNN模型介绍四、CNN模…

skywalking idea中启动调试报错Output path is shared between the same module error

报错信息 简单描述:就是多个moudle一样用了一样的输出路径,这样容易造成冲突 Output path is shared between the same module error 参考:scala - Output path is shared between the same module error - Stack Overflow 解决方法&…

机器学习(四)

贝叶斯分类器与贝叶斯学习: 贝叶斯分类器:只要是一种生成式模型,并且使用到了贝叶斯公式 贝叶斯学习:一定在使用分布估计 贝叶斯分类器并不等于贝叶斯学习 极大似然估计: 先假设某种概率分布形式,再基于训练样例对参数进行估计 集成学习: 如何得到…

WPF学习笔记-FlowDocument实现表格单元格垂直居中以及边框设置

文章目录 概述一、基本方案1.1 添加Grid1.2 添加列1.3 添加行1.4 添加Grid的时候同时添加行和列1.5 添加元素1.6 获取指定单元格的元素1.7 添加TextBlock元素1.7.1 直接添加字符串1.7.2 添加Paragraph1.8 获取文本内容1.9 获取元素二、其他操作2.1 设置边框2.2 设置隔行颜色2.3…

云计算迎变局:阿里云、腾讯云“各有千秋”

毋庸置疑,无论在什么时候什么行业,低价策略都是一柄利器。比如,在电商行业,除了拼多多将低价策略贯彻到底之外,淘宝、京东也将性价比作为发力重点,并通过补贴、秒杀等方式,再度强调自身的“价格…

打造安全医疗网络:三网整体规划与云数据中心构建策略

医院网络安全问题涉及到医院日常管理多个方面,一旦医院信息管理系统在正常运行过程中受到外部恶意攻击,或者出现意外中断等情况,都会造成海量医疗数据信息的丢失。由于医院信息管理系统中存储了大量患者个人信息和治疗方案信息等,…

wps 开发插件

官方文档参考wps官方文档参考 1.环境安装 安装wps https://www.wps.cn/ 安装Node.js https://nodejs.org/en 安装代码编辑器 Visual Studio Code https://code.visualstudio.com/ 环境检查-进入cmd查看 node -v2.demo 2.1 demo下载 打开vscode,新建终端 安装…

HWOD:字符串逆序

一、知识点 回车键的ASCII码是10 fgets()会读入回车键,也就是说字符串最后一个字符之后是回车键,再之后才是\0 字符串逆序不一定要真正的逆序,只需倒着从最后一个字符打印到第一个字符即可 二、题目 1、描述 将一个字符串str的内容颠倒…

Redis开源协议调整,我们怎么办?

2024年3月20日, Redis官方宣布,从 Redis 7.4版本开始,Redis将获得源可用许可证 ( RSALv2 ) 和服务器端公共许可证 ( SSPLv1 ) 的双重许可,时间点恰逢刚刚完成最新一轮融资,宣布的时机耐人寻味。 Redis协议调整,对云计算…

C#实现Word文档转Markdown格式(Doc、Docx、RTF、XML、WPS等)

文档格式的多样性丰富了我们的信息交流手段,其中Word文档因其强大的功能性而广受欢迎。然而,在网络分享、版本控制、代码阅读及编写等方面,Markdown因其简洁、易于阅读和编辑的特性而展现出独特的优势。将Word文档转换为Markdown格式&#xf…

uniapp 小程序和app map地图上显示多个酷炫动态的标点,头像后端传过来,真机测试有效

展示效果 二、引入地图 如果需要搜索需要去腾讯地图官网上看文档,找到对应的内容 1.申请开发者密钥(key):申请密钥 2.开通webserviceAPI服务:控制台 ->应用管理 -> 我的应用 ->添加key-> 勾选WebService…

【了解下YOLO系列】

🌈个人主页:程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

【虚幻引擎】C++ slate全流程开发教程

本套课程介绍了使用我们的虚幻C去开发我们的编辑器,扩展我们的编辑器,设置我们自定义样式,Slate架构设计,自定义我们的编辑器样式,从基础的Slate控件到我们的布局,一步步的讲解我们的的Slate基础知识&#…

org.junit.runners.model.InvalidTestClassError:1. No runnable methods

你们好,我是金金金。 场景 很简单的一个测试方法 我的boot版本:2.7.18 依赖 报错信息 排查 看报错信息提示无效的测试类,没有可运行的方法 看了下依赖信息,引入spring-boot-starter-test依赖也自动的引入了juni5依赖&#xff0…

ssm014基于JSP的乡镇自来水收费系统+jsp

乡镇自来水收费系统的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对乡镇自来水收费信息管理混乱&…

『Apisix安全篇』APISIX 加密传输实践:SSL/TLS证书的配置与管理实战指南

📣读完这篇文章里你能收获到 🌟 了解SSL/TLS证书对于网络通信安全的重要性和基础概念。🔧 掌握在APISIX中配置SSL/TLS证书的基本步骤和方法。📝 学习如何通过修改监听端口,使HTTPS请求更加便捷。🛠️ 认识…

CSS3 Transform变形理解与应用

Transform:对元素进行变形; Transition:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画。但只有两个关键贞。开始,结束。 Animation:对元素某个属…