文档章节

Go基础知识学习(3)闭包

michaelpan
 michaelpan
发布于 2014/08/08 15:40
字数 364
阅读 40
收藏 2

##闭包本质是函数+引用环境,外形是一个匿名函数。 闭包类似一个函数工厂,绑定不同的引用环境,生成不同的函数。 我们还是以回调函数中的例子来说明,不过我们换成闭包来实现“抽象” 将一个数组中偶数的值相加后的结果输出, 将一个数组中奇数的值相加后的结果输出。

package main

import (
	"fmt"
)

func main() {
	//create slice
	s := make([]int, 10)
	fmt.Println(s)
	// init
	for i, _ := range s {
		s[i] = i
	}
	fmt.Println(s)
	//closure
	doubleSum := sum(isDouble)
	singleSum := sum(isSingle)
	fmt.Println(doubleSum(s))
	fmt.Println(singleSum(s))
}

/**
 callback function : elemet who is even number
**/
func isDouble(a int) bool {
	if a%2 == 0 {
		return true
	} else {
		return false
	}
}

/**
 callback function : elemet who is single number
**/
func isSingle(a int) bool {
	if a%2 == 0 {
		return false
	} else {
		return true
	}
}

/*
closure
*/
func sum(f func(int) bool) func([]int) int {
	return func(a []int) int {
		sum := 0
		for _, v := range a {
			if f(v) {
				sum += v
			}
		}
		return sum
	}
}

这里使用sum这个函数 返回两个匿名函数,分别完成对偶数和奇数的相加结果输出,这里面的外部环境是 f func(int) bool, 这个函数的不同,生产出来的匿名函数的功能也就不一样。

##闭包官方有个案例可以参考:

  1. http://www.cnblogs.com/Jifangliang/archive/2008/08/05/1260602.html
  2. http://golang.org/doc/articles/wiki/

##代码: https://github.com/panyingyun/gostudy/blob/master/exp3.go

© 著作权归作者所有

共有 人打赏支持
michaelpan
粉丝 4
博文 33
码字总数 9970
作品 0
杭州
高级程序员
私信 提问
前端计划——一道经典的JavaScript问题(含闭包、事件轮询、作用域等概念解释)

前言:这是一道很经典的Js面试题,涉及到闭包、变量作用域、setTimeout等知识,对于深入理解这些内容很有帮助 题目描述 题目解释 首先,为了下面解释这道题,我们先来补充一些预备知识(大神...

Alarak
2017/01/04
0
0
深入理解javascript系列(九):应用闭包

理论是自信的基础,结合理论的实践才能让我们走的更远。 前两个系列,我记录了闭包的学习,如何利用闭包解决实际问题了?其实,很多东西你我都知道,不是一蹴而就的,不是你今天学了就会了,...

Panthon
2018/06/13
0
0
揭秘Android开发效率提升多倍的利器;Gradle

Gradle是什么? Gradle是一种构建语言,目前是Android的默认构建工具,我们编写的编译脚本,其实就是玩Gradle的API,所以从它更底层的意义上看,是一个编程框架。 因为涉及的内容很多没法一两...

android飞鱼
01/17
0
0
深入理解javascript原型和闭包(完结)

说明:   该教程绕开了javascript的一些基本的语法知识,直接讲解javascript中最难理解的两个部分,也是和其他主流面向对象语言区别最大的两个部分——原型和闭包,当然,肯定少不了原型链...

zh151832
2016/08/02
26
0
jQuery

前端基础进阶:全方位详细图解面向对象、构造函数、原型与原型链 这是一篇非常适合新手理解关于面向对象一切的文章,解答了为什么我们会使用构造函数与原型,构造函数与原型的本质以及 new ...

掘金官方
2018/01/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mybatis缓存的装饰器模式

一般在开发生产中,对于新需求的实现,我们一般会有两种方式来处理,一种是直接修改已有组件的代码,另一种是使用继承方式。第一种显然会破坏已有组件的稳定性。第二种,会导致大量子类的出现...

算法之名
昨天
11
0
单元测试

右键方法 Go To --> Test,简便快速生成测试方法。 相关注解 @RunWith(SpringRunner.class) 表示要在测试环境中跑,底层实现是 jUnit测试工具。 @SpringBootTest 表示启动整个 Spring工程 @A...

imbiao
昨天
2
0
欧拉公式

欧拉公式表达式 欧拉公式的几何意 cosθ + j sinθ 是个复数,实数部分也就是实部为 cosθ ,虚数部分也就是虚部为 j sinθ ,对应复平面单位圆上的一个点。 根据欧拉公式和这个点可以用 复指...

sharelocked
昨天
4
0
burpsuite无法抓取https数据包

1.将浏览器和burpsuite的代理都设置好 2.在浏览器地址栏输入: http://burp 3.下载下面的证书,并将证书导入浏览器 cacert.der

Frost729
昨天
2
0
JeeSite4.x 消息管理、消息推送、消息提醒

实现统一的消息推送接口,包含PC消息、短信消息、邮件消息、微信消息等,无需让所有开发者了解消息是怎么发送出去的,只需了解消息发送接口即可。 所有推送消息均通过 MsgPushUtils 工具类发...

ThinkGem
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部