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小时 ", name ,hours) progress += hours return progress } return study } func main() { studyFunc := GetStudy("李逵") studyFunc(3) studyFunc(5) likuiProgress := studyFunc(2) fmt.Printf("李逵的学习进度%d/10000 ",likuiProgress) studyFunc1 := GetStudy("宋江") studyFunc1(9) studyFunc1(8) songjiangProgress1 := studyFunc1(5) fmt.Printf("宋江的学习进度%d/10000 ",songjiangProgress1) }
输出:
李逵学习了3小时 李逵学习了5小时 李逵学习了2小时 李逵的学习进度10/10000 宋江学习了9小时 宋江学习了8小时 宋江学习了5小时 宋江的学习进度22/10000