加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 18:50:57 所属栏目:大数据 来源:网络整理
导读:##回调函数的定义 回调函数,一个通过函数指针调用的函数,本质上还是函数,由于它的应用场景而出现回调函数这个名词。它非常重要,在一些优秀的C库中经常见到,它不是由函数的实现方实现(但是由实现方定义,通常在头文件定义),而由调用方实现,这样便于问

##回调函数的定义 回调函数,一个通过函数指针调用的函数,本质上还是函数,由于它的应用场景而出现回调函数这个名词。它非常重要,在一些优秀的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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读