文档章节

Go基础知识学习(2) 回调函数

michaelpan
 michaelpan
发布于 2014/08/08 12:10
字数 606
阅读 121
收藏 1

##回调函数的定义 回调函数,一个通过函数指针调用的函数,本质上还是函数,由于它的应用场景而出现回调函数这个名词。它非常重要,在一些优秀的C库中经常见到,它不是由函数的实现方实现(但是由实现方定义,通常在头文件定义),而由调用方实现,这样便于问题的抽象。可以通过下面这个例子简单的体会一下。

例如: 在C语言 标准库中一般是同个函数指针实现, 比如 C库中快速排序的比较函数 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void , const void)) 这里的compar就是这个回调函数

在Android中也是非常多的见到回调函数,比如按键的OnClickListener类似监听接口,本质也是回调函数。

##Golang回调函数 Golang当然也是支持回调函数的,我们来实现一个回调函数的例子: 将一个数组中偶数的值相加后的结果输出, 将一个数组中奇数的值相加后的结果输出。 回调函数是用来抽象功能的利器,这里的sum函数可以理解为对符合条件的slice值求和。 有了这么一个抽象,我们可以很轻易的用sum实现对3的倍数的值求和,4的倍数的值求和, 而且我们不需要重新编写sum函数。

    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)
	// sum all elemets who are even number
	fmt.Println(sum(s, isDouble))
	// sum all elemets who are single number
	fmt.Println(sum(s, isSingle))
}

/**
 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
	}
}

/**
	sum all element who are func number
**/
func sum(s []int, f func(int) bool) int {
	sum := 0
	for _, v := range s {
		if f(v) {
			sum += v
		}
	}
	return sum
}

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

##参考书籍
李先静《系统程序员成长计划》,在这本书中比较深入的对“抽象”这个词的精彩理解,而且将回调函数运用极其娴熟。

© 著作权归作者所有

共有 人打赏支持
michaelpan
粉丝 4
博文 33
码字总数 9970
作品 0
杭州
高级程序员
私信 提问
ES6-7

JavaScript Promise 迷你书(中文版) 超详细介绍promise的gitbook,看完再不会promise...... 本书的目的是以目前还在制定中的ECMAScript 6 Promises规范为中心,着重向各位读者介绍JavaScr...

掘金官方
2018/01/05
0
0
React战记之玩转Flex布局(上篇--容器属性)

零、前言 最近一直在总结Android,前端这块感觉忘得也差不多了 Flex布局以前也听过,但没有详细学习过,趁机会用React玩转一下, 遇到一个新的知识怎么学,一大堆的参数让人发懵,我最喜欢的...

张风捷特烈
2018/12/09
0
0
慕课网最新纯正商业级应用-微信小程序开发实战

第1章 导学与申请appkey 如何更好的学习本课程?如何申请开发者key?如何调用和测试接口? 1-1 微信小程序商业级实战-课程导学。 1-2 优先自己开发 1-3 appkey的申请 1-4 课程维护说明 第2章...

陈冰冰和1
2018/08/08
0
0
微信小程序开发实战-纯正商业级应用

第1章 导学与申请appkey 如何更好的学习本课程?如何申请开发者key?如何调用和测试接口? 1-1 微信小程序商业级实战-课程导学。 1-2 优先自己开发 1-3 appkey的申请 1-4 课程维护说明 第2章...

拍拍阿
2018/08/08
0
0
OkHttp 知识梳理(2) - OkHttp 源码解析之异步请求 & 线程调度

OkHttp 知识梳理系列文章 OkHttp 知识梳理(1) - OkHttp 源码解析之入门 OkHttp 知识梳理(2) - OkHttp 源码解析之异步请求 & 线程调度 OkHttp 知识梳理(3) - OkHttp 之缓存基础 一、前言 在 ...

泽毛
2017/11/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《大话数据结构》读后总结(四)

一、算法 1、算法效率的度量方法 1.1 事后统计方法 通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。该方法具有很大缺陷,不...

徐曙辉
45分钟前
2
0
Android 整体设计及背后意义

阿里妹导读:现实工作中经常可以听到这样的说法:框架的升级带来协议性能的提升、编程模式的变革带来业务的飞跃...... 姑且不论这些表述是否有问题,实际上如果系统地看待事物整体,可能会有...

阿里云云栖社区
47分钟前
2
0
一文纵览EMAS 到底内含多少阿里核心技术能力

EMAS的整体定位是阿里巴巴移动技术对外输出的主窗口,沉淀了阿里巴巴近10年在移动互联网技术架构上的积累以及在一系列垂直场景中所实践的核心技术能力。一方面,EMAS希望为广大开发者提供安全...

阿里云官方博客
今天
2
0
Prometheus简介

Prometheus是什么? Prometheus(普罗米修斯)是一套最初在SoundCloud上构建的开源监视和告警系统 。 特征 普罗米修斯的主要特点是: 具有由度量名称和键/值对标识的时间序列数据的多维数据模...

阿dai学长
今天
2
0
Android 动画Animation

动画分为视图动画(view animation)和属性动画(property animation),视图动画又分为帧动画和补间动画 视图动画控件(iv)点击事件(OnClickListener接口)触发位置在原位置 1.帧动画(Fra...

Coding缘
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部