目录

  • 变量作用域和可见性
  • 匿名函数
  • 闭包
  • 课后练习

变量作用域和可见性

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的更多相关文章

  1. 【C语言】printf函数详解

    C语言printf函数详解 一.相关基础知识 请求printf()打印变量的指令取决于变量的类型,例如打印整数用%d符号,打印字符用%c符号,这些符号称为转换说明(conversion specifi ...

  2. c语言文件操作函数详解

    一.文件操作注意点: 1 打开文件时,如果打开方式加“+”,表示该文件可以“写” ; 2 退出程序一般用exit函数,正常退出参数为0,非正常退出参数为正零值 ; 3 文件的读写操作:按字符.字符串. ...

  3. 【C语言】printf()函数详解

    printf函数称为格式输出函数,其关键字最末一个字母f即为"格式"(format)之意.其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上.在前面的例题中我们已多次使用过这 ...

  4. C语言可变参数函数详解示例

    先看代码 printf(“hello,world!”);其参数个数为1个. printf(“a=%d,b=%s,c=%c”,a,b,c);其参数个数为4个. 如何编写可变参数函数呢?我们首先来看看pr ...

  5. JBPM学习(六):详解流程图

    概念: 流程图的组成: a. 活动 Activity / 节点 Node b. 流转 Transition / 连线(单向箭头) c. 事件 1.流转(Transition) a) 一般情况一个活动中 ...

  6. 【转载】C语言itoa()函数和atoi()函数详解(整数转字符C实现)

    本文转自: C语言itoa()函数和atoi()函数详解(整数转字符C实现) 介绍 C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. int/float to ...

  7. C语言memset函数详解

    C语言memset函数详解 memset() 的作用:在一段内存块中填充某个给定的值,通常用于数组初始化与数组清零. 它是直接操作内存空间,mem即“内存”(memory)的意思.该函数的原型为: # ...

  8. 跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码

    跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开HDevelop,点击助手-打开新的Image Acquisitio ...

  9. Linux C 语言之 Hello World 详解

    目录 Linux C 语言之 Hello World 详解 第一个 C 语言程序 程序运行原理 编译,链接 运行时 链接库 编译器优化 Hello World 打印原理 stdout, stdin 和 ...

  10. R语言服务器程序 Rserve详解

    R语言服务器程序 Rserve详解 R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到 ...

随机推荐

  1. VMWare打开centos,提示内部错误

    如题,VMWare打开centos,提示内部错误.该原因是因为服务被停止了之后没有将其启动,将其启动就解决了. CMD客户端输入命令 services.msc 将关于VM的服务启动就可以了

  2. VC 中的ATL ActiveX 和 MFC ActiveX 有什么区别

    原文转自 https://www.cnblogs.com/zhwl/archive/2012/11/29/2794509.html ATL是ActiveXTemplateLibrary的缩写,它是一套 ...

  3. VBA分别使用MSXML的DOM属性和XPATH进行网页爬虫

    本文要重点介绍的是VBA中的XmlHttp对象(MSXML2.XMLHTTP或MSXML.XMLHTTP),它可以向http服务器发送请求并使用微软XML文档对象模型Microsoft XML Doc ...

  4. shell 实战 -- 基于一个服务启动,关闭,状态检查的脚本

    功能说明: check:检查服务状态,在开启,关闭,状态检查时都会用到这个函数,所以封装起来放到最前面 start:开启服务 stop:关闭服务 fstop:强制关闭 status:检查服务状态 ru ...

  5. robot framework 的关键字Continue For Loop 用法

    Continue For Loop关键字就是python的continue的意思,跳出本层循环,继续执行下一个循环. 我先举个栗子: :FOR    ${index}    IN RANGE    5 ...

  6. 关于使用sublime的一些报错异常退出的解决方法

    1.我用Sublime Text 3,装了一些插件,现在一打开软件就提示plugin_host has exited unexpectedly,如下图 解决方案 :

  7. 关于Vue中,父组件获取子组件的数据(子组件调用父组件函数)的方法

    1. 父组件调用子组件时,在调用处传给子组件一个方法 :on-update="updateData"   2. 子组件在props中,接收这个方法并声明 props: { onUp ...

  8. "工作激发了我的热情,并不断激励着我” - SAP成都研究院Jerry Wang

    SAP 为员工提供了与 SAP的优秀人才以及全球客户和合作伙伴共事的绝佳机会.我相信,只要你努力工作,充满激情,你就能在这里获得成功. -- Jerry Wang 加入SAP 我是从中国电子科技大学的 ...

  9. vue简单todolist

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. javascript动态添加html节点

    之前一直没怎么接触需要动态添加和删除html节点的项目,这次项目中用到了,也学习了. 在一个<table id="tab">标签中添加一个<tr id=" ...