目录

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

变量作用域和可见性

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. 在论坛中出现的比较难的sql问题:10(删除多表中的同一个外键)

    原文:在论坛中出现的比较难的sql问题:10(删除多表中的同一个外键) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  2. SQL Server2008分离数据库

    1.右击数据库 2.Tasks 3.点击Detach 4.选取Drop Connections-->点击确定 5.开启本地数据库默认存储路径C:\Program Files\Microsoft ...

  3. Matlab匿名函数,子函数,私有函数,重载函数,eval和feval函数

    匿名函数,子函数,私有函数等函数类型 匿名函数: 匿名函数没有函数名,也不是.m文件,只包含一个表达式和输入输出参数. Fxy=@(x,y)x.^y+3*x*y x,y为输入输入参数,Fxy为函数名 ...

  4. ABP 基于DDD的.NET开发框架 学习(三)创建模块:任务管理

    1.图标i获取:https://material.io/icons/查看2.js中创建如var _tenantService = abp.services.app.tenant;需清除页面的缓存,按c ...

  5. WSL 服务自动启动

    WSL 服务自动启动 参考 https://zhuanlan.zhihu.com/p/47733615 Windows 启用 WSL 功能支持 > Enable-WindowsOptionalF ...

  6. 【转载】Sqlserver使用SUBSTRING函数截取字符串

    在SQL语句查询过程中,Sqlserver支持使用LEFT().RIGHT().SUBSTRING()等几个函数对字符串进行截取操作,SubString函数相对于其他两个函数来说更灵活,使用场景更多, ...

  7. 探究Java如何实现原子操作(atomic operation)

    1. 让我们首先了解下java 中 Volatile 关键字 Volatile可实现java内存模型当中的可见性, java内存模型的可见性: 可见性,是指线程之间的可见性,一个线程修改的状态对另一个 ...

  8. django_rest framework 接口开发(二)

    1 a. 认证 - 仅使用: from django.views import View from rest_framework.views import APIView from rest_fram ...

  9. sed进阶教程

    寻址规则 常规寻址 如果没有指定地址,那么命令将应用于每一行. 如果只有一个地址,那么命令应用于与这个地址匹配的任意行. 如果指定了由逗号分隔的两个地址,那么命令应用于匹配第一个地址(不包括第一个地址 ...

  10. 温控PID自测验程序

    #pragma once #ifndef _PID_H_ #define _PID_H_ #include <vector> #include <map> using name ...