目录

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

变量作用域和可见性

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. oracle update left join 写法

    oracle update left join 写法 (修改某列,条件字段在关联表中) 案例: E:考核表 X,:用户表 USERNAME 关联 需求:修改营业部最高分 分析:通过登录账号的营业部OR ...

  2. Mysql union和union all用法

    1: 什么时候用union和union all ?    我们经常会碰到这样的应用,两个表的数据按照一定的查询条件查询出来以后,需要将结果合并到一起显示出来,这个时候 就需要用到union和union ...

  3. Consul基本使用

    原文: Consul基本使用 date: 2019-05-13 17:01:37 前言 官网介绍Consul是一个分布式服务网格(Service Mesh)解决方案... 而我目前的理解是提供了分布式 ...

  4. C# Aforge设置摄像头视频属性和控制属性

    修改后的代码:github 一.调用windows自身摄像头属性设置窗口 使用VideoCaptureDevice对象的DisplayPropertyPage(IntPtr parentWindow) ...

  5. Hystrix原理与实战

    Hystrix原理与实战 背景 分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务. 比如:订单服务调用商品服务,商品服务调用库存服务. 对于同步调用,当库存服务不可用时,商品 ...

  6. CentOS7.X基于LAMP环境搭建cacti

    1.搭建好LAMP环境 2.登录数据库创建cacti create database cacti default character set utf8; 创建cacti的账户密码 grant all ...

  7. 数据库索引碎片——数据库sql

    文章:检测和整理索引碎片 文章:[笔记整理]SQL Server 索引碎片 和 重建索引 文章介绍了检查表的索引碎片百分比 文章:[小问题笔记(八)] 常用SQL(读字段名,改字段名,打印影响行数,添 ...

  8. linux网络编程之posix消息队列

    在前面已经学习了System v相关的IPC,今天起学习posix相关的IPC,关于这两者的内容区别,简单回顾一下: 而今天先学习posix的消息队列,下面开始: 接下来则编写程序来创建一个posix ...

  9. js rsa sign使用笔记(加密,解密,签名,验签)

    你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...

  10. 使用Nginx实现反向代理 - 不同的子域名映射到不同的后台地址

    1.配置IP域名 C:\Windows\System32\drivers\etc\hosts中加入 127.0.0.1 8081.max.com 127.0.0.1 8082.max.com 2.配置 ...