Golang——匿名函数and闭包

本文介绍了Golang中的匿名函数,包括如何定义没有名字的函数并赋值给变量进行调用,以及全局匿名函数的使用。同时,文章详细讨论了闭包的概念,即函数结合其引用的外部变量环境。通过示例,如解决leetcode210题的匿名函数递归,深入理解闭包的工作原理。参考链接提供了更多关于Golang闭包的详细内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.匿名函数就是没有名字的函数
将匿名函数赋给一个变量(函数变量),再通过该变量来调用匿名函数

dfs := func(i int) int {
 ...
}
dfs(1)

2.全局匿名函数

//多个变量定义,可以用()包裹,不用重复写var
var (
    Test_fun = func (n1 int, n2 int) int {
        return n1 - n2
    }
)


3.踩坑
匿名函数递归 :leetcode210

//递归调用会报错
dfs := func(i int) int {
    ...
    dfs(2)
}

//正确方法,先声明
var dfs func(i int) int
dfs = func(i int) int {
    ...
    dfs(2)
}

闭包:
函数+引用的环境,即引用了外部的变量。
https://tiancaiamao.gitbooks.io/go-internals/content/zh/03.6.html

package main

import "fmt"

// 闭包:函数 + 引用的变量
// count函数返回了一个函数类型,这个函数里没有定义变量,而是引用了该函数外部的变量i
func count() func() int {
	//即使count函数return了,这个变量仍然没有被回收,下次调用该变量仍然在,故变量由go自动分配在内存某处,而且肯定不是在栈上(因为栈return后就被回收了),故是在堆上
	//因为i在堆上,所以不是被初始化为0,除非count被调用重新分配
	i := 0
	return func() int {
		i++
		return i
	}
}

func main() {
	//count函数返回的不是一个变量,而是一个函数类型。故打印该numFunc1不是值,而是该函数类型的地址。
	//实际底层闭包的返回值包括两部分:函数地址 + 外部引用的变量地址
	numFunc1 := count()

	fmt.Println(numFunc1())
	fmt.Println(numFunc1())

	numFunc2 := count()
	fmt.Println(numFunc2())
	fmt.Println(numFunc2())
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值