速战速决 go - go 面向对象: 函数(函数也是一种类型,匿名函数,闭包)

速战速决 go https://github.com/webabcd/GoSample
作者 webabcd

速战速决 go - go 面向对象: 函数(函数也是一种类型,匿名函数,闭包)

示例如下:

oop/function2.go

// go 面向对象 - 函数(函数也是一种类型,匿名函数,闭包)

package oop

import "fmt"

func Function2Sample() {
	function2_sample1()
	function2_sample2()
	function2_sample3()
}

func function2_sample1() {
	// 函数也是一种类型(可以实现类似函数指针的效果)
	// 下面声明了一个名为 myFunc 的变量,其类型为 func(name string) string
	var myFunc func(name string) string

	// 为函数类型的变量赋值时,要求函数的参数和返回值定义要与变量的类型相同
	myFunc = func21
	// 调用指针指向的函数
	fmt.Println(myFunc("webabcd")) // func21: webabcd

	// 为函数类型的变量赋值时,要求函数的参数和返回值定义要与变量的类型相同
	myFunc = func22
	// 调用指针指向的函数
	fmt.Println(myFunc("webabcd")) // func22: webabcd
}
func func21(name string) string {
	return "func21: " + name
}
func func22(name string) string {
	return "func22: " + name
}

func function2_sample2() {
	// 定义匿名函数
	a := func(name string) {
		fmt.Println("hello: " + name)
	}
	// 调用匿名函数
	a("webabcd") // hello: webabcd

	// 匿名函数做字典键值的示例
	var b = map[string]func(){
		"x": func() {
			fmt.Println("xxx")
		},
		"y": func() {
			fmt.Println("yyy")
		},
	}
	b["x"]() // xxx
	b["y"]() // yyy

	// 匿名函数实现回调的示例
	func23("webabcd", func(result string) {
		fmt.Println(result) // hello: webabcd
	})

	// 把匿名函数的定义和调用放到一起
	func() {
		fmt.Println("把匿名函数的定义和调用放到一起") // 把匿名函数的定义和调用放到一起
	}()
}

// 此函数的第 2 个参数是一个函数类型,其用于实现回调逻辑
func func23(name string, callback func(string)) {
	// 回调
	callback("hello: " + name)
}

func function2_sample3() {
	// 获取一个闭包
	a := func24()

	// 闭包引用的闭包外的变量的生命周期会拉长到与闭包一致
	fmt.Println(a()) // 1
	fmt.Println(a()) // 2
	fmt.Println(a()) // 3
}

// 函数返回的函数就是一个闭包(closure)
func func24() func() int {
	// 闭包外的变量
	a := 0
	// 返回一个闭包
	return func() int {
		// 闭包的特性:闭包引用的闭包外的变量的生命周期会拉长到与闭包一致
		a++
		return a
	}
}

速战速决 go https://github.com/webabcd/GoSample
作者 webabcd

posted @ 2022-02-08 14:24  webabcd  阅读(54)  评论(0编辑  收藏  举报