Go语言系列教程(十二)之函数完结篇
Hello,各位小伙伴大家好,我是小栈君。上一期我们讲到了关于函数的有参、无参、匿名函数,本期我们分享一下关于go语言函数类型、匿名函数和闭包的概念和实战。闲话不多说,立马开始分享。
在Go语言中,函数也是一种数据类型,我们可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型。

//IT干货栈,每天分享IT干货
// 定义一个函数类型 --求和
type FunctionType func(a, b int) (num int) //声明一个函数类型, func后面没有函数名
//在函数中传参中我们有一个参数为函数类型的
func Calc(a, b int, functionType FunctionType) (num int) {
return functionType(a, b)
}
func Add(a, b int) (sum int) {
sum = a + b
return
}
func Abs(a, b int) int {
return a - b
}
func main() {
num := Calc(1, 2, Add)
fmt.Println("求和计算结果--》", num)
calc := Calc(3, 2, Abs)
fmt.Println("求差计算结果", calc)
functionType := Add
i := Calc(4, 5, functionType)
fmt.Println(i)
}
所以在Go语言中,我们不仅仅使用的是变量,常量,对象等,也是可以使用函数类型进行传参,这个传参是多种多样的。
函数之匿名函数和闭包
匿名函数就是一种不需要定义函数名的函数。在Go语言里,所有的匿名函数(Go语言规范中称之为函数字面量)都是闭包。
匿名函数是指不需要定义函数名的一种函数实现方式,它并不是一个新概念,最早可以回溯到1958年的Lisp语言。其中我们写一个简单的例子

只是将一个匿名函数赋值给一个变量f ,然后进行执行,当然最后的结果就是4啦~
当然关于匿名函数的定义是可以分很多种的。

温馨提示,千万别忘记后面的括号。此处是直接调用匿名函数并进行传参。
所谓闭包就是一个函数“捕获”了和它在同一作用域的其它常量和变量。这就意味着当闭包被调用的时候,不管在程序什么地方调用,闭包能够使用这些常量或者变量。
它不关心这些捕获了的变量和常量是否已经超出了作用域,所以只有闭包还在使用它,这些变量就还会存在。

如图所示,我们可以看到在外部定义了i为1 ,str是“it小栈君”,但是在匿名函数内部我们将变量重新赋值后。内部和外部都成为了100和go了。
所以由此可知函数闭包是以引用的方式捕获外部变量。可能这样说还是太深奥了,那么小栈君这边也是通过几个示例给大家解释一下吧。

我们首先定义了个普通的函数,并没有初始化开始的值,只有当函数被调用的时候才进行值的初始化,分配空间为0。当函数调用完毕后函数值就会被释放。所以我们得到的值就一直是2。
但是如果我们将函数类型设定成返回一个匿名函数,业务逻辑不改变的前提下,如图所示:

如图所示,我们将add2设置成返回一个匿名函数,在匿名函数中有相同的业务逻辑就是a进行自加一后,然后进行相加。
我们通过f来进行调用返回函数,在进行调用闭包函数。之前有句话说的“它不关心这些捕获了的变量和常量是否已经超出了作用域,所以只有闭包还在使用它,这些变量就还会存在。”
只要函数还在调用(f()),那么它就一直存在,然而普通函数调用后就直接释放掉了。对add2的一次调用会生成一个局部变量a并返回一个匿名函数。
每次调用时匿名函数时,该函数都会先使a的值加1,再返回a的和。第二次调用add2时,会生成第二个a变量,并返回一个新的匿名函数。新匿名函数操作的是第二个a变量。
通过这个例子,我们看到变量的生命周期不由它的作用域决定:add2返回后,变量a仍然隐式的存在于f中。
所以各位小伙伴也要尽量掌握关于匿名函数和闭包的概念哦,今天的分享就到这里啦,如果你喜欢我的分享,麻烦你点击收藏、分享或再看。让更多的小伙伴加入我们的学习阵营中来。
这里每天会分享包含java,go,Python,大数据,人工智能的相关干货,我们一起提高,一起进步。我是小栈君,我们明天再见,拜了个拜。

本文由博客一文多发平台 OpenWrite 发布!
Go语言系列教程(十二)之函数完结篇的更多相关文章
- CRL快速开发框架系列教程十二(MongoDB支持)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- webpack4 系列教程(十二):处理第三方JavaScript库
教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十二):处理第三方 JavaScript 库>原文地址.或者来我的小站看更多内容:godbm ...
- Spring Boot2 系列教程 (十二) | 整合 thymeleaf
前言 如题,今天介绍 Thymeleaf ,并整合 Thymeleaf 开发一个简陋版的学生信息管理系统. SpringBoot 提供了大量模板引擎,包含 Freemarker.Groovy.Thym ...
- Unity3D脚本中文系列教程(十二)
http://dong2008hong.blog.163.com/blog/static/4696882720140313545332/ GameObject类,继承自Object Unity场景中所 ...
- Spring Boot系列教程十二:Spring boot集成Redis
一.创建项目 项目名称为 "springboot_redis",创建过程中勾选 "Web","Redis",第一次创建Maven需要下载依赖 ...
- Spring Boot2 系列教程(十二)@ControllerAdvice 的三种使用场景
严格来说,本文并不算是 Spring Boot 中的知识点,但是很多学过 SpringMVC 的小伙伴,对于 @ControllerAdvice 却并不熟悉,Spring Boot 和 SpringM ...
- CRL快速开发框架系列教程十(导出对象结构)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Go语言入门教程(十)之函数
Hello 各位小伙伴大家好,我是小栈君,假期一眨眼就过去了.不知道大家玩的是否开心呢? 上次我们讲到了关于Go语言的流程控制,小栈君也希望小伙伴跟着小栈君一步一个脚印的敲一下代码,相互进步.本期我们 ...
- Unity3D脚本中文系列教程(十六)
Unity3D脚本中文系列教程(十五) ◆ function OnPostprocessAudio (clip:AudioClip):void 描述:◆ function OnPostprocess ...
随机推荐
- Width Height -- (2)
上回说到,宽高对于块级元素和行内元素发生的改变,结果是块级元素会接受宽高属性所发生的改变的,而行内元素不接受宽高属性所发生的改变. 但是,事无绝对 —— CSS属性display 通过上回进行的测试我 ...
- nginx root与alias
root和alias都可以定义在location模块中,都是用来指定请求资源的真实路径,但又有区别: 采用如下设置 location /static/ { root /data/w3; } 实际访问h ...
- gdb gdbtui
1. gdbtui 打开tui模式 gdbtui a.out gdb -tui a.out 调试一个正在运行的进程 gdb -p pid 在linux自带的终端里是正常显示的,但是在securecrt ...
- iOS 报错信息: dyld: Library not loaded: @rpath/XCTest.framework/XCTest Referenced from
新建项目,引入framework,运行时出现警告:dyld: Library not loaded: @rpath/RLLibrary.framework/RLLibrary Referenced ...
- nginx 安装第三方模块(lua)并热升级
需求: nginx上将特定请求拒绝,并返回特定值. 解决办法: 使用lua脚本,实现效果. 操作步骤: 安装Luajit环境 重新编译nginx(目标机器上nginx -V 配置一致,并新增两个模块n ...
- javascript中事件总结&通用的事件侦听器函数封装&事件委托
前言: JAVASCRIPT与HTML之间的交互是通过事件来实现的.事件,就是文档或浏览器窗口中发生的一些特定交互瞬间.可以使用侦听器( 或处理程序 )来预定事件,以便事件发生时执行相应的代码.这种在 ...
- UDP基础
UDP主要特点: (1)UDP是无连接的,发送数据不需要建立连接,减少了开销和发送数据之前的时延. (2)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持连接状态表. (3)UDP面向报 ...
- 新版Notepad++加十六进制查看的插件HexEditor(转载+总结)
用到hex文件查看,老版本的notepad++是可以安装的,新版本的是安装不了,这个差评啊, 但是网上有方法:https://github.com/chcg/NPP_HexEdit/releases下 ...
- Scrapy笔记02- 完整示例
Scrapy笔记02- 完整示例 这篇文章我们通过一个比较完整的例子来教你使用Scrapy,我选择爬取虎嗅网首页的新闻列表. 这里我们将完成如下几个步骤: 创建一个新的Scrapy工程 定义你所需要要 ...
- LNMP+memcached
部署LNMP+memcached网站平台,通过PHP页面实现对memcached服务器的数据操作,实现以下目标:部署LNMP实现PHP动态网站架构为PHP安装memcache扩展创建PHP页面,并编写 ...