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函数-匿名函数与闭包函数的更多相关文章

  1. php中的匿名函数(Anonymous functions)和闭包函数(closures)

    一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...

  2. day12 函数的嵌套调用 闭包函数,函数对象

    函数嵌套: 函数嵌套: 嵌套指的是,一个物体包含另一个物体,函数嵌套就是一个函数包含另一个函数 按照函数的两个阶段 嵌套调用 指的是在函数的执行过程中调用了另一个函数,其好处可以简化外层大函数的代码, ...

  3. python 函数的作用域,闭包函数的用法

    一.三元表达式 if条件成功的值    if  条件   else else条件成功的值 #if条件成立的结果 if 条件 else else条件成立的结果 # a = 20 # b = 10 # c ...

  4. php函数总结(闭包函数,匿名函数)

    php函数总结 1.普通函数 2.变量函数 function myfun($a) { echo $a; } $b = "myfun"; $b("test"); ...

  5. day12:闭包函数&匿名函数

    闭包函数 闭包函数的定义: 如果内函数使用了外函数的局部变量并且外函数把内函数返回出来的过程 叫做闭包里面的内函数是闭包函数 一个简单的闭包函数示例: def songyunjie_family(): ...

  6. Js闭包函数

    一.变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域.变量的作用域无非就是两种:全局变量和局部变量.Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. ( ...

  7. 不可不知的JavaScript - 闭包函数

    闭包函数 什么是闭包函数? 闭包函数是一种函数的使用方式,最常见的如下: function fn1(){ function fn(){ } return fn; } 这种函数的嵌套方式就是闭包函数,这 ...

  8. 035-PHP简单定义一个闭包函数

    <?php /* + 什么是闭包函数?即一个函数内部,包含了1-N个匿名函数, + 用处是可以做局部数据缓存与实现封装(有点类似class) */ # 函数内部,定义一个匿名函数,即可称为闭包函 ...

  9. 浅谈python中的闭包函数

    闭包函数初探 通常我们定义函数都是这样定义的 def foo(): pass 其实在函数式编程中,函数里面还可以嵌套函数,如下面这样 def foo(): print("hello worl ...

  10. 10-Python入门学习-函数的对象与嵌套、名称空间与作用域、闭包函数

    一.函数的对象 函数是第一类对象,指的是函数名指向的值(函数)可以被当作数据去使用 def func():# func=函数的内地址 print('from func') print(func) ag ...

随机推荐

  1. Uart学习笔记

    分享一个蛮好的链接:https://blog.csdn.net/wordwarwordwar/article/details/73662379 今天在看的资料是S家的DW_apb_uart的官方文档. ...

  2. 自定义Toast排队重复显示问题:

    原文 http://blog.csdn.net/baiyuliang2013/article/details/38655495Toast是安卓系统中,用户误操作时或某功能执行完毕时,对用户的一种提示, ...

  3. Vue和vue-template-compiler版本不一致

    vue项目,package.json中Vue和vue-template-compiler版本不一致时,执行npm run dev有时会报错, 提示vue和vue-template-compiler版本 ...

  4. OC中NSLog函数输出格式罗列

    格式 类型 格式 类型 格式 类型 %@ 对象 %d,%i 整数 %u 无符整数 %f 浮点 %x,%X 二进制整数 %o 八进制整数 %zu size_t %p 指针 %e 浮点(科学计算) %g ...

  5. MyBatis模糊查询异常: '%${}''读取jdbc属性

    '%${}''总是传root, 后来发现${username}读取了jdbc里面的属性username,于是将jdbc属性名修改,成功

  6. mybatis 入门参考

    参考:https://www.cnblogs.com/xdp-gacl/p/4261895.html

  7. Prometheus组件

    Prometheus组件 上一小节,通过部署Node Exporter我们成功的获取到了当前主机的资源使用情况.接下来我们将从Prometheus的架构角度详细介绍Prometheus生态中的各个组件 ...

  8. Python 100 Days

    Day 1 python的缺点 执行效率稍低,因此计算密集型任务可以由C/C++编写. 在开发时可以选择的框架太多(如Web框架就有100多个),有选择的地方就有错误. python解释器 官方的Py ...

  9. C# 篇基础知识2——运算符、类型转换、流程控制、枚举、结构体和数组、函数

    1.运算符.类型转换 计算某年y某月m某日d是周几的基姆拉尔森公式公式:int week = (d + 2*m + 3*(m + 1)/5 + y + y/4 - y/100 + y/400 + 1) ...

  10. Python运行目录或压缩文件

    如果你在你的工程文件根目录下放一个__main__.py文件,你就可以使用根目录运行整个程序. 你的工程像这样 ex. app/ |-test.py |-test2.py |-__main__.py ...