• 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小时
    ", 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
    

      

  • 相关阅读:
    058:表关系之一对一
    057:表关系之一对多
    056:ORM外键删除操作详解
    055:ORM外键使用详解
    054:Meta类中常见配置
    053:Field的常用参数详解:
    052:ORM常用Field详解(3)
    051:ORM常用Field详解(2)
    C#中在WebClient中使用post发送数据实现方法
    C# WebClient类上传和下载文件
  • 原文地址:https://www.cnblogs.com/yunweiqiang/p/11796135.html
Copyright © 2020-2023  润新知