Golang函数-匿名函数与闭包函数
Golang函数-匿名函数应用案例回调函数和闭包函数
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.匿名函数概述
- 什么是匿名函数:
- 顾名思义,就是没有函数名,只有函数体,函数可以被作为一种类型被赋值给函数类型的变量,匿名函数往往以变量方式被传递。Go是支持匿名函数的,即在需要使用函数时再定义函数
- Go域名函数定义就是没有名字的普通函数,定义格式如下:
func (参数列表) (返回值列表){
函数体
}
二.定义匿名函数
1>.定义匿名函数时直接调用
- package main
- import (
- "fmt"
- )
- func main() {
- /*
- 定义匿名函数时直接调用
- */
- res := func(x int, y int) (z int) {
- z = x + y
- return z
- }(100, 20)
- fmt.Printf("res的类型为[%T],res的值为[%d]\n", res, res)
- }
2>.先声明匿名函数,再调用匿名函数
- package main
- import (
- "fmt"
- )
- func main() {
- /*
- 定义匿名函数,此时add是一个函数类型,只不过它是一个匿名函数。
- */
- add := func(x int, y int) (z int) {
- z = x + y
- return z
- }
- fmt.Printf("add的类型为[%T]\n", add)
- /*
- 我们可以通过函数类型add来多次调用匿名函数
- */
- res1 := add(100, 200)
- res2 := add(300, 500)
- fmt.Printf("res1的类型为[%T],res1的值为[%d]\n", res1, res1)
- fmt.Printf("res2的类型为[%T],res2的值为[%d]\n", res2, res2)
- }
3>.匿名函数可以作为返回值被多次调用
- package main
- import (
- "fmt"
- )
- //使用type来定义一个匿名函数类型
- type FUNCTYPE func(int, int) int
- func demo() FUNCTYPE {
- /*
- demo的返回值为我们上面定义的匿名函数类型
- */
- return func(x int, y int) int {
- res := x + y
- return res
- }
- }
- func main() {
- /*
- add的类型为(匿名)函数类型
- */
- add := demo()
- fmt.Printf("add的类型为[%T],add匿名函数的内存地址是[%X]\n", add, add)
- /*
- 我们可以通过函数类型add来多次调用匿名函数
- */
- res1 := add(100, 200)
- res2 := add(300, 500)
- fmt.Printf("res1的类型为[%T],res1的值为[%d]\n", res1, res1)
- fmt.Printf("res2的类型为[%T],res2的值为[%d]\n", res2, res2)
- }
三.匿名函数的应用场景(匿名函数经常被用于实现回调函数,闭包等)
1>.回调函数案例
- package main
- import (
- "fmt"
- )
- /*
- 函数回调:
- 简称回调,英文名为:"Callback",即"call then back",被主函数调用运算后会返回主函数。
- 是指通过函数参数传递到其它代码的,某一块可执行代码的引用
- 匿名函数作为回调函数的设计在Go语言的系统包中是很常见的,比如strings包中又有着中实现,代码如下所示:
- func TrimFunc(s string, f func(rune) bool) string{
- return TrimRightFunc(TrimLeftFunc(s,f),f)
- }
- */
- func callback(f func(int, int) int) int {
- return f(10, 20)
- }
- func add(x int, y int) int {
- return x + y
- }
- func main() {
- /*
- 匿名函数(函数名本身是代码区的一个地址)的用途非常广泛,匿名函数本身是一种值,可以方便的保存在各种容器中实现回调函数和操作封装
- */
- fmt.Println(add)
- /*
- 函数回调操作
- */
- fmt.Println(callback(add))
- }
2>.闭包函数案例
- package main
- import (
- "fmt"
- )
- /*
- 什么是闭包函数:
- 闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。
- 闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。
- Go语言支持匿名函数作为闭包。匿名函数是一个"内联"语句或表达式。
- 下面实例中,创建了函数"getSequence()",返回另外一个匿名函数"func() int"。该函数的目的在闭包中递增number变量。
- */
- func getSequence() func() int {
- number := 100
- return func() int {
- /*
- 匿名函数的优越性在于可以直接使用函数内的变量,不必声明。
- */
- number += 1
- return number
- }
- }
- func main() {
- /*
- f1为一个空参匿名函数类型,number变量的值依旧为100
- */
- f1 := getSequence()
- /*
- 调用f1函数,number变量自增1并返回
- */
- fmt.Println(f1())
- fmt.Println(f1())
- fmt.Println(f1())
- fmt.Println("=====我是分割线=====")
- /*
- 创建新的匿名函数 f2,并查看结果
- */
- f2 := getSequence()
- fmt.Println(f2())
- fmt.Println(f2())
- }
Golang函数-匿名函数与闭包函数的更多相关文章
- php中的匿名函数(Anonymous functions)和闭包函数(closures)
一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...
- day12 函数的嵌套调用 闭包函数,函数对象
函数嵌套: 函数嵌套: 嵌套指的是,一个物体包含另一个物体,函数嵌套就是一个函数包含另一个函数 按照函数的两个阶段 嵌套调用 指的是在函数的执行过程中调用了另一个函数,其好处可以简化外层大函数的代码, ...
- python 函数的作用域,闭包函数的用法
一.三元表达式 if条件成功的值 if 条件 else else条件成功的值 #if条件成立的结果 if 条件 else else条件成立的结果 # a = 20 # b = 10 # c ...
- php函数总结(闭包函数,匿名函数)
php函数总结 1.普通函数 2.变量函数 function myfun($a) { echo $a; } $b = "myfun"; $b("test"); ...
- day12:闭包函数&匿名函数
闭包函数 闭包函数的定义: 如果内函数使用了外函数的局部变量并且外函数把内函数返回出来的过程 叫做闭包里面的内函数是闭包函数 一个简单的闭包函数示例: def songyunjie_family(): ...
- Js闭包函数
一.变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域.变量的作用域无非就是两种:全局变量和局部变量.Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. ( ...
- 不可不知的JavaScript - 闭包函数
闭包函数 什么是闭包函数? 闭包函数是一种函数的使用方式,最常见的如下: function fn1(){ function fn(){ } return fn; } 这种函数的嵌套方式就是闭包函数,这 ...
- 035-PHP简单定义一个闭包函数
<?php /* + 什么是闭包函数?即一个函数内部,包含了1-N个匿名函数, + 用处是可以做局部数据缓存与实现封装(有点类似class) */ # 函数内部,定义一个匿名函数,即可称为闭包函 ...
- 浅谈python中的闭包函数
闭包函数初探 通常我们定义函数都是这样定义的 def foo(): pass 其实在函数式编程中,函数里面还可以嵌套函数,如下面这样 def foo(): print("hello worl ...
- 10-Python入门学习-函数的对象与嵌套、名称空间与作用域、闭包函数
一.函数的对象 函数是第一类对象,指的是函数名指向的值(函数)可以被当作数据去使用 def func():# func=函数的内地址 print('from func') print(func) ag ...
随机推荐
- 三、linux基础-常用命令man_cd_|_find_ln_>_history
3通用命令3.1 man命令man pwd 来查看该命令的全部帮助手册备注:命令最终是在内核中执行的,但是内核并无法直接识别,所以先通过shell执行,然后再交给内核执行3.2 cd 命令c ...
- JS如何阻止事件冒泡
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default5.aspx. ...
- [Qt5] 使用Qt设计器绘制主窗口
实践代码: git clone https://github.com/dilexliu/learn_qt5.git Step1: Qt设计器绘制窗口 保存会得到一个文件: mainwindow.ui ...
- webpack中devtool的配置方案[开发模式]---[线上模式]
// 开发模式下 module.exports = { mode: 'development', devtool: 'cheap-module-eval-source-map' } // 线上模式下 ...
- HTML中元素 标签 属性
HTNL中元素是以开始标签开始 结束标签结尾的 如:<p>this is a paragraph </p> <p>是开始标签 </p>是结束标签 ...
- ajax的分页查询
(1)先写个显示数据的页面,分页查询需要那几个部分呢? 1.首先是查询的文本框输入,还有查询按钮,那么就开始写代码吧 1 2 3 4 <div> <input type=" ...
- Java 虚拟机程序监控工具软件
jdk自带的查看工具(jdk安装目录/bin) .Java VisualVM .jconsole
- RabbitMq学习笔记——概念
1.RabbitMQ简介 MQ全称为Message Queue(消息队列),是一种“应用程序”<—>“应用程序”的通信方法.MQ是一个典型的“消费”<—>“生产者”模型的代表, ...
- vue的高级使用技巧
全局组件注册 一般组件应用弊端,比较笨拙繁琐低效,比如我们写了一些组件,需要引用上的时候就通过import导入,那如果是高频繁需要使用的组件,则需要在每个使用的时候都需要引入并注册 假设现在有两个组件
- Hadoop入门概念
Hadoop作者:Dong Cutting. 受Google三篇论文的启发. 版本: Apache:官方版本 Cloudera:官方版本的封装,优化,打很多patch,商业版本 HortonWorks ...