go 匿名函数和闭包
匿名函数
1. 函数也是一种类型,因此可以定义作为一个函数类型的变量
package main
import "fmt"
// 函数作为参数
func add(a, b int) int {
return a + b
}
func testfunc(a, b int, fun func(int, int) int) int {
sum := fun(a, b)
return sum
}
func main() {
sum := testfunc(, , add)
fmt.Println(sum)
}
2. 匿名函数即没有名字的函数
注意defer 和匿名函数的使用
package main
import "fmt"
func add(a, b int) int {
return a + b
}
// 函数名也可以赋值给变量
func test1() {
ff := add
fmt.Printf("ff的类型是%T\n", ff)
sum := ff(, )
fmt.Printf("sum is %d \n", sum)
}
/*
ff的类型是func(int, int) int
sum is 9
*/
// 匿名函数
func test2() {
f1 := func(a, b int) int {
return a + b
}
fmt.Printf("f1的类型是%T\n", f1)
sum := f1(, )
fmt.Printf("sum is %d \n", sum)
}
/*
f1的类型是func(int, int) int
sum is 9
*/
// defer
func test3() int {
i :=
defer fmt.Printf("defer i is %d\n", i)
i =
fmt.Printf("i is %d\n", i)
return i
}
/*
i is 100
defer i is 10
return i is 100
*/
// defer 和匿名函数
func test4 () int {
i:=
defer func() {
fmt.Printf("defer i is %d \n", i)
}()
i=
fmt.Printf("i is %d\n", i)
return i
}
/*
i is 100
defer i is 100
return i is 100
*/
-.
func main() {
// test1()
// test2()
// i := test3()
// fmt.Printf("return i is %d", i)
i := test4()
fmt.Printf("return i is %d", i)
}
闭包
一个函数和与其相关的引用环境组合组成的实体
个人认为go中的闭包和python中的闭包概念一样 都是 一个外层函数 嵌套 一个内层函数 内层函数包含对外层函数变量的引用 外层 函数返回值为内层函数的函数名
闭包 举例
package main import (
"fmt"
"strings"
"time"
) func test1() func(int) int {
index :=
return func(d int) int {
index += d
return index
} } func test2(base int) func(int) int {
return func(a int) int {
base += a
return base
}
} func test3(suffix string) func(name string) string {
return func(name string) string {
if !strings.HasSuffix(name, suffix) {
// return name+suffix
return fmt.Sprintf("%s%s", name, suffix)
}
return name
}
} func test4(a int) (func(int) int, func(int) int) { add := func(b int) int {
a += b
return a
} sub := func(c int) int {
a -= c
return a
} return add, sub
} func test5(){
for i:=; i<=;i++{
go func(){
fmt.Println()
}()
}
time.Sleep(time.Second)
} func test6(){
for i:=; i<=;i++{
go func(a int){
fmt.Println(a)
}(i)
}
time.Sleep(time.Second)
} func main() {
// f := test1()
// fmt.Printf("f(1) return is %d\n", f(1)) // 11
// fmt.Printf("f(2) return is %d\n", f(2)) //13
// fu := test1()
// fmt.Printf("fu(1) return is %d\n", fu(5)) // 15
// fmt.Printf("fu(2) return is %d\n", fu(6)) //21 // f := test2(5)
// fmt.Printf("f(1) return is %d\n", f(1)) // 6
// fmt.Printf("f(2) return is %d\n", f(2)) //8
// fu := test2(10)
// fmt.Printf("fu(1) return is %d\n", fu(5)) // 15
// fmt.Printf("fu(2) return is %d\n", fu(6)) //21 // f3 := test3(".jpg")
// fmt.Printf("f3('ctz') return is %s\n", f3("ctz")) // f3('ctz') return is ctz.jpg
// fmt.Printf("f3('yunnan.jpg') return is %s\n", f3("yunnan.jpg")) //f3('yunnan.jpg') return is yunnan.jpg // add, sub := test4(10) // fmt.Println(add(5), sub(6)) //15 9
// fmt.Println(add(3), sub(4)) // 12 8 test5() }
go 匿名函数和闭包的更多相关文章
- JavaScript笔记 第十六章 匿名函数和闭包
1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数. 一.匿名函数 //普通函数 function getName() { return 'name'; } a ...
- 第一百一十节,JavaScript匿名函数和闭包
JavaScript匿名函数和闭包 学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂 ...
- JavaScript(第十五天)【匿名函数和闭包】
学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂.(所需基础15章的时候已经声明 ...
- 从匿名函数(闭包特性)到 PHP 设计模式之容器模式
匿名函数(匿名函数) 匿名函数,也叫闭包函数,它允许临时创建一个没有指定名称的函数,常用作回调函数参数的值,也可以作为变量的值来使用.具体的使用见以下示例代码: /* 示例一:声明一个简单匿名函数,并 ...
- php的匿名函数和闭包函数
php的匿名函数和闭包函数 tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use 引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因 ...
- js匿名函数和闭包总结
js匿名函数和闭包总结 一.总结 一句话总结:匿名函数的最主要作用是创建闭包,闭包就是将函数内部和函数外部连接起来的一座桥梁.内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕.闭包可以用 ...
- 匿名函数、闭包、lambda表达式、Block
C#有lambda.匿名函数,js有匿名函数.闭包,OC中有block,看到这是不是心中有一万个草泥马在跑,不过它们这些都是换汤不换药,不同语言名字不一样. 从功能性上说lambda和closure( ...
- Golang之匿名函数和闭包
Go语言支持匿名函数,即函数可以像普通变量一样被传递或使用. 使用方法如下: main.go package main import ( "fmt" ) func main() { ...
- js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题)
js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题) 一.总结 需要好好看下面代码 本质是因为匿名函数用到了循环中的变量,而普通方式访问的话,匿名函数的访问在循环之后,所以得到的i是循环 ...
- javascript进阶课程--第三章--匿名函数和闭包
javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...
随机推荐
- MQTT - Connect报文解析
#include <bits/stdc++.h> using namespace std; int main() { ] = { /* * 固定报头: MQTT报文类型(1), 保留位 * ...
- IO编程(2)-操作文件和目录
操作文件和目录 如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只 ...
- 用Python实现的数据结构与算法:基本搜索
一.顺序搜索 顺序搜索 是最简单直观的搜索方法:从列表开头到末尾,逐个比较待搜索项与列表中的项,直到找到目标项(搜索成功)或者 超出搜索范围 (搜索失败). 根据列表中的项是否按顺序排列,可以将列表分 ...
- C++接口继承与实现继承的区别和选择
1.接口继承与实现继承的区别 <Effective C++>条款三十四:区分接口继承和实现继承中介绍的比较啰嗦,概括地说需要理解三点: (1)纯虚函数只提供接口继承,但可以被实现: (2) ...
- Eureka的一些注意事项
1.心跳设置:只能在application.yml中 2. 注册到Eureka上面的服务名称 与swagger2使用的时候,需要配置此项,否则显示服务名称为unknown 3.高可用的Eureka 4 ...
- 2018 CTSC&APIO 游记
CTSC 居然是CTSC先考,弄得我有些意外. 5.6 早上5:30乘坐高铁来到北京,差不多下午了吧,具体几点忘记了,然后来到宾馆 试机也没有去,就直接在宾馆颓废了. 5.7 考试的第一天,6:3 ...
- PHP判断变量类型和类型转换的三种方式
前言: PHP 在变量定义中不需要(不支持)明确的类型定义.变量类型是根据使用该变量的上下文所决定的.所以,在面对页码跳转.数值计算等严格的格式需求时,就要对变量进行类型转换. 举例如下: $foo ...
- 简便开发插件 -- lombok
lombok是一款可以精减java代码.提升开发人员生产效率的辅助工具,可以利用注解在编译期自动生成setter/getter/toString()/constructor代码. 彻底将开发人员从繁琐 ...
- 高质量API网关组件实现
PI网关组件的作用? 1.网关直接代替MVC当中的Controller层,减少编码量提高开发效率 2.统一API接口的出入参格式,提高API的友好性 3.自动检测API接口规范,提高接口的质量 4.统 ...
- [HTML5和Flash视频播放器]Video.js 学习笔记(一 ) HLS库:videojs-contrib-hls
DEMO地址:https://github.com/Tinywan/PHP_Experience https://github.com/videojs/videojs-contrib-hls 下载JS ...