Go语言的函数06---闭包函数

package main

import "fmt"
/*
李逵和武松的Study方法的逻辑是几乎一模一样的
然而为了分别保存两人的学习进度,需要开辟两个全局变量,函数内部的需要使用两条分支结构才能完成业务逻辑
如果是108将都来学习。。。
此时代码的可复用性很差
*/
var progress int
func Study(name string, hours int) ( int) {
	fmt.Printf("%s学习了%d小时",name,hours)
	progress += hours
	return hours
}
func main081() {
	progress := Study("黑旋风",5)
	fmt.Printf("李逵的学习进度%d/10000",progress)
}

/*
使用闭包函数优化Study
每个人有不同的学习进度,将这个进度保存在【各自的闭包】中
*/
/*
闭包函数:返回函数的函数
闭包函数的好处:使用同一份内层函数的代码,创建出任意多个不同的函数对象,这些对象各自的状态都被保存在函数闭包(外层函数)中,各行其道,互不干扰
*/

func GetStudy(name string) func(int) int{
	var progress int
	study := func(hours int) int {
		fmt.Printf("%s学习了%d小时\n", name ,hours)
		progress += hours
		return progress
	}
	return study
}

func main() {
	studyFunc := GetStudy("李逵")
	studyFunc(3)
	studyFunc(5)
	likuiProgress := studyFunc(2)
	fmt.Printf("李逵的学习进度%d/10000\n",likuiProgress)
	studyFunc1 := GetStudy("宋江")
	studyFunc1(9)
	studyFunc1(8)
	songjiangProgress1 := studyFunc1(5)
	fmt.Printf("宋江的学习进度%d/10000\n",songjiangProgress1)
}

输出:

李逵学习了3小时
李逵学习了5小时
李逵学习了2小时
李逵的学习进度10/10000
宋江学习了9小时
宋江学习了8小时
宋江学习了5小时
宋江的学习进度22/10000

  

posted @ 2019-11-05 08:04  Ethan_Cheng  阅读(551)  评论(0编辑  收藏  举报