所以,什么是闭包?

来源:7-1 函数式编程

matthew21

2021-12-05

有些第一次出现的语法也不解释,这给听课带来很大困难。我对java还算熟悉,听这个课很多地方也是云里雾里的。

package main

import "fmt"

//返回函数
func adder() func(int) int {
	sum := 0
	return func(i int) int {
		sum += i
		return sum
	}
}

func main() {
	// 为啥我需要先把函数赋给一个变量
	f := adder()
	//为什么我需要循环产能看到效果,直接用f(100)就不行
	for i := 0; i < 100; i++ {
  //为什么这里f(i),我理解这个函数没有参数,为啥他可以传参
		fmt.Println(f(i))
	}

}

写回答

3回答

慕粉8203926

2021-12-11

为啥我需要先把函数赋给一个变量?

这个变量是函数的返回值,就是func(int) int这个函数。这样可以改变这个函数的外部变量sum。

理解了这个,后面的问题不用回答你就理解了。

这里的闭包就和js的闭包一样,都是用于改变函数作用域外面的变量的。

1
0

文刀走云

2022-04-01

举个现实中的例子,main()就是甲方公司,现在他要找乙方公司f := adder()做sum这个项目,可以提供资料i。

乙方f发现自己不会sum+=i,于是找到外包公司func(int) int,把sum项目转包给它完成。

所以,你应该理解了吧,看似是f完成了sum项目,其实是f转包的func(int)int完成的,f实质是其了一个中介和调度的作用

下载视频          
0
0

尼克2018

2022-01-18

func adder() func(int) int{}

你可以把 func(int) int 这部分看成是函数adder的返回数据。你再去理解f := adder()就好理解了。其实

f就是func(int) int

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程