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

news/2024/6/20 21:26:39/文章来源:https://blog.csdn.net/llg___/article/details/137156105

文章目录

  • 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.luyixian.cn/news_show_1035105.aspx

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

相关文章

如何划分训练集、测试集、验证集

训练集、测试集和验证集是在机器学习和数据科学中常用的术语,用于评估和验证模型的性能。它们通常用于监督学习任务中。 1. 训练集(Training Set):训练集是用于训练机器学习模型的数据集。在训练期间,模型使用训练集中…

若依框架mysql 搜索中文等于不生效

背景&#xff0c;字段存储的是中文 不生效代码如下 <if test"constellation ! null and constellation ! ">AND u.constellation #{constellation}</if> 正确生效的代码如下 <if test"constellation ! null and constellation ! ">A…

瑞吉外卖实战学习--8、人员禁用和启用

前言 1、通过前端页面查看接口 会发现请求方式是put 请求接口是employee 2、检查页面传值 根据浏览器的请求可以看到传值为id和status 2、写put请求&#xff0c;添加修改时间和修改人的id然后传回给后台 /*** 启用和禁用员工账号* param request* param employee* return…

【面试HOT200】数组篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试coding部分的&#xff0c;整理期间苛求每个算法题目&#xff0c;平衡可读性与代码性能&#xff08;leetcode运行复杂度均打败80%以上&#xff09;。 &#x1f970;来源&#xff1a;材料主要源于…

对【AI技术创业】有哪些机会进行分析和引导

文章目录 方向一&#xff1a;行业解决方案,以下是一些常见的行业解决方案&#xff1a;方向二&#xff1a;智能产品和服务,以下是一些智能产品和服务的示例&#xff1a;方向三&#xff1a;教育和培训 1.智能客户服务&#xff1a; 利用自然语言处理&#xff08;NLP&#xff09;和…

京东云16核64G云服务器租用优惠价格500元1个月,35M带宽

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年&#xff0c;35M带宽&#xff0c;配置为&#xff1a;16C64G-450G SSD系统盘-35M带宽-8000G月流量 华北-北京&#xff0c;京东云活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 京东云16核64G云服务器…

Transformers in Vision:A Survey 阅读笔记

ACM上的一篇综述&#xff0c;讨论Transformer在CV上的应用。 摘要&#xff1a; Among their salient benefits,Transformers enable modeling long dependencies between inputsequence elements and support parallel processing of sequence as compared to recurrent networ…

echarts 地图 自己圈地图 乡镇街道

这个是方式是我实在不愿意做的&#xff01; 如果有现成的最好&#xff0c;没有办法的情况下再用这个东西。 今天公司有一个项目&#xff0c;地方划分了一块区域&#xff0c;但是国家没有审核&#xff0c;但是项目里面用到了一个地图展示数据&#xff01;然后就需要我们自己把…

【爬虫框架Scrapy】01 开启Scrapy之路

爬虫基础专栏&#xff1a;http://t.csdnimg.cn/r9gt9 前言 如果你没有爬虫基础&#xff0c;相信我&#xff0c;不要进行下去&#xff0c;没什么意义&#xff0c;你会撞的头破血流&#xff0c;最后破灭你那本就不多的兴趣选择放弃&#xff01;&#xff01;&#xff01; OK&…

3D检测:从pointnet,voxelnet,pointpillar到centerpoint

记录centerpoint学习笔记。目前被引用1275次&#xff0c;非常高。 地址&#xff1a;Center-Based 3D Object Detection and Tracking (thecvf.com) GitHub - tianweiy/CenterPoint CenterPoint&#xff1a;三维点云目标检测算法梳理及最新进展&#xff08;CVPR2021&#xff…

重读Java设计模式: 深入探讨建造者模式,构建复杂对象的优雅解决方案

引言 在软件开发中&#xff0c;有时需要构建具有复杂结构的对象&#xff0c;如果直接使用构造函数或者 setter 方法逐个设置对象的属性&#xff0c;会导致代码变得冗长、难以维护&#xff0c;并且容易出错。为了解决这个问题&#xff0c;我们可以使用建造者模式。 一、建造者…

HarmonyOS实战开发-slider组件的使用

介绍 本篇Codelab主要介绍slider滑动条组件的使用。如图所示拖动对应滑动条调节风车的旋转速度以及缩放比例。 相关概念 slider组件&#xff1a;滑动条组件&#xff0c;通常用于快速调节设置值&#xff0c;如音量调节、亮度调节等应用场景。 环境搭建 软件要求 DevEco Stu…

基于YOLOV5+Pyqt5农作物叶片病害检测系统

1、引言 农作物病害的精准检测与识别是推动农业生产智能化与现代化发展的重要举措。随着计算机视觉技术的发展&#xff0c;深度学习方法已得到快速应用&#xff0c;利用卷积神经网络进行农作物病害检测与识别成为近年来研究的热点。基于传统农作物病害识别方法&#xff0c;分析…

EXCEL VBA将word里面的指定的关键词替换掉后并标记红色字体

EXCEL VBA将word里面的指定的关键词替换掉后并标记红色字体 Sub 开关() Call 新建副本 Call ReplaceAndHighlightInFolder End Sub Sub 新建副本()fpath ThisWorkbook.Path & "\"Dim MyFile As ObjectSet MyFile CreateObject("Scripting.FileSystemObjec…

MySQL数据库(数据库连接池)

文章目录 1.批处理应用1.基本介绍2.批处理演示1.创建测试表2.修改url3.编写java代码 3.批处理源码分析 2.数据库连接池1.传统连接弊端分析2.数据库连接池基本介绍1.概念介绍2.数据库连接池示意图3.数据库连接池种类 3.C3P0连接池1.环境配置1.导入jar包2.将整个lib添加到项目中3…

商业分析师BA与数据分析有什么关系?

文章主题:BA工作与数据分析 分享嘉宾&#xff1a;丛珊 职业&#xff1a;某事业单位BA分析师 在实际工作中&#xff0c;需求分析工作可以有多种分类方法&#xff0c;对于大型、集成型信息系统的需求分析&#xff0c;通常可以区分为业务需求、功能需求、数据需求、性能需求与安…

在java开发中平方怎么表示?平方表示的方法有哪几种?

在java开发中平方怎么表示&#xff1f;平方表示的方法有哪几种&#xff1f; 在我们计算一个数的几次方的时候。我们按照课堂中老师的教法就是在一个数的右上角写上一个小小的数字用来表示一个数的几次方&#xff0c;那么大家知道“在java开发中平方怎么表示吗&#xff1f;“和…

【区块链 链外交易】SoK Off The Chain Transactions

SoK Off The Chain Transactions 摘要 本文对区块链进行了简单介绍,分析目前区块链的缺点——交易吞吐量和速度慢的原因,在此基础上引出解决此问题的方法,也是本轮将要论述的主题——链外交易。之后介绍了链外交易的基本概念和结构,并对两种类型的链外交易:通道和信任链…

在线版的超级马里奥 Super Mario HTML5

原本是在csdn资源找个代码学习的&#xff0c;无奈下载了几份都是垃圾代码(下载了几份都是) 废话不多说&#xff0c;直接上干活。代码、音效、图片、样式都包含 <!doctype html> <html> <head> <meta charsetutf-8 /> <title>Super Mario HTML5 …

VScode-配置文件

导入配置文件 ShiftCtrlp 输入&#xff1a; import 选择文件 点击确认 导出配置文件 设置选择导出 确认导出 保存为本地文件 保存文件