【原创】go语言学习(六)函数详解2
目录
- 变量作用域和可见性
- 匿名函数
- 闭包
- 课后练习
变量作用域和可见性
1、全局变量量,在程序整个生命周期有效。
var a int = 10
2、局部变量量,分为两种:
1)函数内定义,
2)语句句块内定义。
func add(a int, b int) int {
var sum int = 0 //sum是局部变量量
if a > 0 {
var c int = 100 //c是布局变量量,尽在if语句句块有效
}
}
3. 可⻅见性,包内任何变量量或函数都是能访问的。
包外的话,⾸首字⺟母⼤大写是可导出的 能够被其他包访问或调⽤用。
小写表示是私有的,不不能被外部的包访问。
func add(a int, b int) int {
}
//add这个函数只能在包内部调⽤用,是私有的,不不能被外部的包调
匿名函数
1、函数也是一种类型,因此可以定义一个函数类型的变量
func add(a, b int) int {
return a + b
} func testFunc1() {
f1 := add
// %T 函数类型
fmt.Printf("typeof f1=%T\n", f1)
sum := f1(2, 5)
fmt.Printf("sum=%d\n", sum)
}
2、匿名函数,即没有名字的函数
//匿名函数
func testFunc2() {
f1 := func(a, b int) int {
return a + b
}
// %T 函数类型
fmt.Printf("typeof f1=%T\n", f1)
sum := f1(2, 5)
fmt.Printf("sum=%d\n", sum) }
3、defer中使用匿名函数
// defer应用
func testFunc3() {
var i int = 0
// 最后输出
defer fmt.Printf("defer i=%d\n", i)
i = 100
fmt.Printf("i=%d", i)
return
}
//defer + 匿名函数= 闭包
func testFunc4() {
var i int = 0
// 最后输出+匿名函数
defer func() {
fmt.Printf("defer i=%d\n", i)
}()
i = 100
fmt.Printf("i=%d", i)
return
}
4、函数作为一个参数
// 函数作为参数
func add_1(a, b int) int {
return a + b
} func sub(a, b int) int {
return a - b
} func calc(a, b int, op func(int, int) int) int {
return op(a, b)
} func testFunc5() {
sum := calc(100, 300, add_1)
sub := calc(100, 300, sub)
fmt.Printf("sum=%d sub=%d\n", sum, sub)
}
闭包
1、闭包:一个函数和与其相关的引⽤用环境组合⽽而成的实体
// 闭包 func Adder() func(int) int {
var x int
//闭包
return func(d int) int {
x += d
return x
}
}
func testClosure1() {
// 闭包累加
f := Adder()
ret := f(1)
fmt.Printf("ret=%d\n", ret)
ret = f(20)
fmt.Printf("ret=%d\n", ret)
ret = f(100)
fmt.Printf("ret=%d\n", ret) // 从0加起
f1 := Adder()
ret = f1(1)
fmt.Printf("ret=%d\n", ret)
ret = f1(20)
fmt.Printf("ret=%d\n", ret)
ret = f1(100)
fmt.Printf("ret=%d\n", ret)
}
2、带参数的闭包
// 带参数闭包
func add(base int) func(int) int {
return func(i int) int {
base += i
return base
}
} func testClosure2() {
tmp1 := add(10)
fmt.Println(tmp1(1), tmp1(2))
tmp2 := add(100)
fmt.Println(tmp2(1), tmp2(2))
}
3、test.bmp, test.jpg 参数闭包
// test.bmp, test.jpg 参数闭包
func makeSufficxFunc(suffix string) func(string) string {
return func(name string) string {
if !strings.HasPrefix(name, suffix) {
return name + suffix
}
return name
}
} func testClosure3() {
func1 := makeSufficxFunc(".bmp")
func2 := makeSufficxFunc(".jpg")
fmt.Println(func1("test"))
fmt.Println(func2("test"))
}
4、返回两个闭包
func calc(base int) (func(int) int, func(int) int) {
add := func(i int) int {
base += i
return base
} sub := func(i int) int {
base -= i
return base
} return add, sub
} func testClosure4() {
f1, f2 := calc(10)
fmt.Println(f1(1), f2(2))
fmt.Println(f1(3), f2(4))
fmt.Println(f1(5), f2(6))
fmt.Println(f1(7), f2(8))
}
5、需要参数,不然封装的结果都是5
func testClosure5() {
//for i:=0; i< 5; i++ {
// go func(){
// fmt.Println(i)
// }()
//}
//time.Sleep(time.Second) for i := 0; i < 5; i++ {
go func(index int) {
fmt.Println(index)
}(i)
}
time.Sleep(time.Second)
}
【原创】go语言学习(六)函数详解2的更多相关文章
- 【C语言】printf函数详解
C语言printf函数详解 一.相关基础知识 请求printf()打印变量的指令取决于变量的类型,例如打印整数用%d符号,打印字符用%c符号,这些符号称为转换说明(conversion specifi ...
- c语言文件操作函数详解
一.文件操作注意点: 1 打开文件时,如果打开方式加“+”,表示该文件可以“写” ; 2 退出程序一般用exit函数,正常退出参数为0,非正常退出参数为正零值 ; 3 文件的读写操作:按字符.字符串. ...
- 【C语言】printf()函数详解
printf函数称为格式输出函数,其关键字最末一个字母f即为"格式"(format)之意.其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上.在前面的例题中我们已多次使用过这 ...
- C语言可变参数函数详解示例
先看代码 printf(“hello,world!”);其参数个数为1个. printf(“a=%d,b=%s,c=%c”,a,b,c);其参数个数为4个. 如何编写可变参数函数呢?我们首先来看看pr ...
- JBPM学习(六):详解流程图
概念: 流程图的组成: a. 活动 Activity / 节点 Node b. 流转 Transition / 连线(单向箭头) c. 事件 1.流转(Transition) a) 一般情况一个活动中 ...
- 【转载】C语言itoa()函数和atoi()函数详解(整数转字符C实现)
本文转自: C语言itoa()函数和atoi()函数详解(整数转字符C实现) 介绍 C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. int/float to ...
- C语言memset函数详解
C语言memset函数详解 memset() 的作用:在一段内存块中填充某个给定的值,通常用于数组初始化与数组清零. 它是直接操作内存空间,mem即“内存”(memory)的意思.该函数的原型为: # ...
- 跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码
跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开HDevelop,点击助手-打开新的Image Acquisitio ...
- Linux C 语言之 Hello World 详解
目录 Linux C 语言之 Hello World 详解 第一个 C 语言程序 程序运行原理 编译,链接 运行时 链接库 编译器优化 Hello World 打印原理 stdout, stdin 和 ...
- R语言服务器程序 Rserve详解
R语言服务器程序 Rserve详解 R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到 ...
随机推荐
- Codeforces Round #419 (Div. 1) (ABCD)
1. 815A Karen and Game 大意: 给定$nm$矩阵, 每次选择一行或一列全部减$1$, 求最少次数使得矩阵全$0$ 贪心, $n>m$时每次取一列, 否则取一行 #inclu ...
- shell 学习笔记5-shell-if语句
一.if条件语句 1.语法 1)单分支结构 第一种 if <条件表达式> then 指令 fi 第二种 if <条件表达式>:then 指令 fi 上文的"<条 ...
- 持久化存储之 PV、PVC、StorageClass
PV介绍: PersistentVolume(PV)是群集中由管理员配置的一块存储. 它是集群中的资源,就像节点是集群资源一样. PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个 ...
- ubuntu下安装软件时报错解决:Unmet dependencies. Try 'apt-get -f install' with no packages
在错误后面运行以下代码,补全依赖项: sudo apt-get -f install
- VBA子程序(十六)
子程序(Sub Procedures,也叫子过程)与函数类似,但有一些差异. 子过程不需要有返回一个值,而函数可能会或可能不会有返回一个值. 子程序可以不用call关键字来调用. 子程序总是包含在Su ...
- ipv4与ipv6 Inet4Address类和Inet6Address类
在设置本地IP地址的时候,一些人会疑惑IPv4与IPv6的区别是什么?下面由学习啦小编为你分享ipv4与ipv6的区别的相关内容,希望对大家有所帮助. ipv4与ipv6的区别 在windows 7以 ...
- 直接插入排序算法(java)
直接插入排序是将未排序的数据插入至已排好序序列的合适位置. 具体流程如下: 1.首先比较数组的前两个数据,并排序: 2.比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置: 3.比较第四 ...
- CentOS7安装CDH 第十章:CDH中安装Spark2
相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...
- centos7创建共享文件夹
0.检查是否已经安装samba rpm -qi samba 1.未安装,安装samba, 如果已安装,请忽略: yum -y install samba samba-client 2.共享一个目录,使 ...
- Flutter中的按钮组件介绍
Flutter 里有很多的 Button 组件很多,常见的按钮组件有:RaisedButton.FlatButton.IconButton.OutlineButton.ButtonBar.Floati ...