IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Go匿名函数和闭包 -> 正文阅读

[Java知识库]Go匿名函数和闭包

Go匿名函数和闭包

1.匿名函数

匿名函数即没有名字的函数,一般用于只使用一次的函数,或者直接用变量调用的函数。

方法一:

在定义函数时直接调用,此函数只能调用一次。

func main() {
    a := func(n1 int, n2 int) int{
		return n1 + n2
	}(2,3)
	fmt.Println(a)
}

方法二:

将匿名函数赋给一个变量(函数变量),再通过变量调用匿名函数。

func main() {
    a := func(n1 int, n2 int) int{
		return n1+n2
	}
	ans := a(2,3)
	fmt.Println(ans)
}

同理,也可定义全局匿名函数

var(
	a = func (n1 int, n2 int) int {
		return n1+n2
	}
)

func main() {
	ans := a(2,3)
	fmt.Println(ans)
}

2.闭包

闭包:一个匿名函数和其相关引用环境组成的一个整体。

直接看一个例子:

func AddUpper(a int) func (int) int{
	var n int = 10
	fmt.Println("a =",a)
	return func(x int) int{
		n += x;
		return n
	}
}

func main() {
	f := AddUpper(1)
	fmt.Println("f(1) =",f(1))
	fmt.Println("f(2) =",f(2))
	fmt.Println("f(3) =",f(3))
    ff := AddUpper(2)
	fmt.Println("ff(1) =", ff(4))
	fmt.Println("ff(2) =", ff(5))
	fmt.Println("ff(3) =", ff(6))
}
/*
a = 1
f(1) = 11
f(2) = 13
f(3) = 16
a = 2
ff(1) = 14
ff(2) = 19
ff(3) = 25
*/

由例子可见,下面的代码就是一个闭包

func AddUpper(a int) func (int) int{
	var n int = 10
	fmt.Println("a =",a)
	return func(x int) int{
		n += x;
		return n
	}
}

下面的代码就是闭包中的匿名函数

func(x int) int{
	n += x;
	return n
}

其他的则是相关引用环境

再分析结果可知:

闭包就相当于java中的一个类,每次调用该闭包时( f := AddUpper(1) ),就新建了一个包的环境。引用环境中的所有变量都储存在包内,以此就可以在保持闭包状态的情况下,调用匿名函数。

其实,闭包也就相当于下面的全局变量+函数,不过使用闭包可以同时维持多个全局变量。

var n int = 10
func AddUpper(x int) int{
		n += x
		return n
}

func main() {
	f := AddUpper(1)
	fmt.Println(f)
}

例:添加后缀

func makeSuffix(suffix string) func(string) string {
	return func(s string) string {
		if !strings.HasSuffix(s, suffix) {
			return s + suffix
		}
		return s
	}
}

func main() {
	f := makeSuffix(".jpg")
	fmt.Println(f("123"))
	fmt.Println(f("123.jpg"))
}

参考资料:【尚硅谷】Golang入门到实战教程丨一套精通GO语言

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:24:23  更:2021-09-24 10:25:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:30:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码