golang闭包

闭包:一个函数和与其相关的引用环境组合而成的实体

先看下面的这个例子:

package main

import "fmt"

func adder() func(int) int {
     sum := 0
     return func(x int) int {
          sum += x
          return sum
     }
}

func main() {
     pos, neg := adder(), adder()
     for i := 0; i < 10; i++ {
          fmt.Println(
               pos(i),
               neg(-2*i),
          )
     }
}

执行结果:

0 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90

个人理解:

其实理解闭包的最方便的方法就是将闭包函数看成一个类,一个闭包函数调用就是实例化一个类。

然后就可以根据类的角度看出哪些是“全局变量”,哪些是“局部变量”了。

比如上例中的adder函数返回func(int) int 的函数

pos和neg分别实例化了两个“闭包类”,在这个“闭包类”中有个“闭包全局变量”sum。所以这样就很好理解返回的结果了。

时间: 2024-10-23 04:13:15

golang闭包的相关文章

golang 闭包

说起golang闭包,在官方手册里面看过一次,没怎么用过,还是因为6哥经常用,阅读他的代码好多闭包,emmm,今天就学习一下. 在过去近十年时间里,面向对象编程大行其道,以至于在大学的教育里,老师也只会教给我们两种编程模型,面向过程和面向对象.孰不知,在面向对象思想产生之前,函数式编程已经有了数十年的历史.就让我们回顾这个古老又现代的编程模型,看看究竟是什么魔力将这个概念在21世纪的今天再次拉入我们的视野 闭包是函数式编程语言中的概念,没有研究过函数式语言的人可能很难理解闭包的强大(我就是其中一

【GoLang】golang 闭包 closure 参数传递的蹊跷!

结论: 闭包函数可以直接引用外层代码定义的变量, 但是,注意,闭包函数里面引用的是变量的地址, 当goroutine被调度时,改地址的值才会被传递给goroutine 函数. 介绍 go的闭包是一个很有用的东西.但是如果你不了解闭包是如何工作的,那么他也会给你带来一堆的bug.这里我会拿出Go In Action这本书的一部分代码,来说一说在使用闭包的时候可能遇到的坑.全部的代码在github上. 闭包的坑 首先看一段代码: search/search.go 29 // Launch a gor

golang闭包里的坑

介绍 go的闭包是一个很有用的东西.但是如果你不了解闭包是如何工作的,那么他也会给你带来一堆的bug.这里我会拿出Go In Action这本书的一部分代码,来说一说在使用闭包的时候可能遇到的坑.全部的代码在github上. 闭包的坑 首先看一段代码: search/search.go 29 // Launch a goroutine for each feed to find the results. 30 for _, feed := range feeds { 31 // Retrieve

关于golang闭包

闭包不是必报,睚眦必报,这种事咱不干,咱要干的是程序上所谓的闭包. 在讲闭包之前呢?我们先看一个程序 func add(a, b int) int { return a + b } 乍一看,就感觉想骂人,这是啥?这是在考验我的智商?不,咱是那意思嘛,消消气,先听我说,此功能就是两个数相加得到和,但是我们要用它干一票大的!玄机来了,怎么做,我给他传一个数字,等我想用时,我再传入一个数字,和就出来了! 听起来是不是感觉牛x了 好,开始额的表演..... 我们先这样做 func fadd(a, b,

第一章.java&amp;golang的区别之:闭包

对于golang一直存有觊觎之心,但一直苦于没有下定决心去学习研究,最近开始接触golang.就我个人来说,学习golang的原动力是因为想要站在java语言之外来审视java和其它语言的区别,再就是想瞻仰一下如此NB的语言.年前就想在2019年做一件事情,希望能从各个细节处做一次java和golang的对比分析,不评判语言的优劣,只想用简单的语言和可以随时执行的代码来表达出两者的区别和底层涉及到的原理.今天是情人节,馒头妈妈在加班,送给自己一件贴心的礼物,写下第一篇对比文章:java&gola

Golang泛型函数

目前,golang还不支持模板函数(类型参数化),所以看上去不得不为每一种类型都实现一个函数.但是Golang可以利用空接口interface{}和闭包/高阶函数来实现泛型函数. 1 空接口 空接口interface{}是指方法集为空的接口,任何类型的值都可以赋值给空接口.接口相关内容请参见另一篇博客<Golang中的接口> // interface{} func minimum(first interface{}, rest ...interface{}) interface{} {    

Golang-函数式编程(闭包)

github:https://github.com/ZhangzheBJUT/blog/blob/master/closure.md 一 函数式编程概论 在过去近十年时间里,面向对象编程大行其道,以至于在大学的教育里,老师也只会教给我们两种编程模型,面向过程和面向对象.孰不知,在面向对象思想产生之前,函数式编程已经有了数十年的历史.就让我们回顾这个古老又现代的编程模型,看看究竟是什么魔力将这个概念在21世纪的今天再次拉入我们的视野. 随着硬件性能的提升以及编译技术和虚拟机技术的改进,一些曾被性能

Golang 中关于闭包的坑

所谓闭包是指内层函数引用了外层函数中的变量或称为引用了自由变量的函数,其返回值也是一个函数,了解过的语言中有闭包概念的像 js,python,golang 都类似这样. python 中的闭包可以嵌套函数,像下面这样: def make_adder(addend): def adder(augend): return augend + addend return adder 转化成 golang 代码则像下面这样: func outer(x int) func(int) int{ func in

golang 函数二 (匿名函数和闭包)

匿名函数就是没有定义函数名称的函数.我们可以在函数内部定义匿名函数,也叫函数嵌套. 匿名函数可以直接被调用,也可以赋值给变量.作为参数或返回值.比如: func main(){     func(s string){     //直接被调用         println(s)     }("hello gopher!!!")     /*     func(s string){     //未被调用         println(s)     }     */ } func mai