golang中匿名函数的应用-回调函数-闭包

package main

import (
	"fmt"
	"strconv"
)

type funcType func(int, int) int // 自定义函数类型
type Callback func(int, int) int
type Callback2 func(string)

func main() {
	// 匿名函数经常被用于回调函数或闭包等

	// 1. 定义匿名函数时直接调用
	//anonymousFunc1()

	// 2. 先声明匿名函数,再调用匿名函数
	//anonymousFunc2()

	// 3. 匿名函数可以作为返回值被多次调用
	//f11 := anonymousFunc3()
	//fmt.Println(f11(11, 22))
	//fmt.Println(f11(300, 500))

	// 4. 这是一个简单的回调例子,调用函数test时,调用真正的实现函数add
	//fmt.Println(test(10, 20, add))

	// 5. 这是一个将字符串转为Int的例子,在转换失败的情况下执行回调函数,输出错误信息
	fmt.Println(stringToInt("15", errLog))
	fmt.Println(stringToInt("15ab", errLog))

	// 6. 闭包案例
	//f := adder()
	//fmt.Println(f())
	//fmt.Println(f())
	//fmt.Println(f())
	//f2 := adder()
	//fmt.Println(f2())
	//fmt.Println(f2())
}

// 方式一,定义匿名函数时直接调用
func anonymousFunc1() {
	fmt.Println("anonymouseFunc1执行了")
	a := func(data int) int {
		fmt.Println("匿名函数执行了", data)
		return data + 1
	}(100)
	fmt.Println(a)
}

// 方式二:先声明匿名函数,再调用匿名函数
func anonymousFunc2() {
	fmt.Println("anonymousFunc2执行了")
	f := func(str string) string {
		fmt.Println("匿名函数2执行了")
		return str + " world"
	}
	ret := f("hello")
	fmt.Println(ret)
}

// 方式三:匿名函数可以作为返回值被多次调用
func anonymousFunc3() funcType {
	return func(x, y int) int {
		res := x + y
		return res
	}
}

// 方式四:这是一个简单的回调例子,调用函数test时,调用真正的实现函数add
// 回调函数就是一个通过函数指针调用的函数。
// 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
// 回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应
func test(x, y int, callback Callback) int {
	return callback(x, y)
}
func add(x, y int) int {
	return x + y
}

// 方式五:这是一个将字符串转为Int的例子,在转换失败的情况下执行回调函数,输出错误信息
func stringToInt(str string, callback Callback2) int64 {
	if value, err := strconv.ParseInt(str, 0, 0); err != nil {
		callback(err.Error())
		return 0
	} else {
		return value
	}
}
func errLog(msg string) { // 记录日志消息的具体实现
	fmt.Println(msg)
}

// 方式六:作为闭包
// 闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。
// 闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。
func adder() func() int {
	sum := 0
	fmt.Println("this line exec")
	return func() int {
		sum++
		return sum
	}
}

  

posted @ 2021-09-28 17:40  专职  阅读(140)  评论(0编辑  收藏  举报