• 函数柯里化的理解与应用


    函数柯里化我理解,就是可以生成已经部分配置好的函数,这里的重点是生成新函数,因此,柯里化通常应用在需要一批不同的函数,但是这批函数除了部分代码不一样外,其他大部分都是相同的,这时,通过柯里化,能够达到配置函数的目的,减少模板代码

    实际实例

    在生产环境中,我们一般都会用到动态配置中心,一般动态配置中心的client会允许用户监听一个key,当key值变化后,可以执行用户提供的回调函数,示例代码如下:

    tcc2.Watch(ctx, PcAppInfoKey, func(value string, err error) {
    		log := common.Logger(ctx)
    		if err != nil {
    			log.WithError(err).Error("tcc2 PcAppInfoKey watch failed")
    			return
    		}
    		err = json.Unmarshal([]byte(value), &pcApps)
    		if err != nil {
    			log.WithError(err).Error("pc apps json unmarshal failed")
    			return
    		}
    	}, time.Second * 30)
    
    tcc2.Watch(ctx, MobileAppInfoKey, func(value string, err error) {
    		log := common.Logger(ctx)
    		if err != nil {
    			log.WithError(err).Error("tcc2 MobileAppInfoKey watch failed")
    			return
    		}
    		err = json.Unmarshal([]byte(value), &mobileApps)
    		if err != nil {
    			log.WithError(err).Error("mobile apps json unmarshal failed")
    			return
    		}
    	}, time.Second * 30)
    

    可以发现,这里的回调函数往往大同小异,可以用柯里化来很方便的生成这些监听函数,减少这些模板代码

    func listenKey(ctx context.Context, target interface{}, key string) func(value string, err error) {
    	return func(value string, err error) {
    		log := common.Logger(ctx)
    		if err != nil {
    			log.WithError(err).Errorf("tcc2 %s watch failed", key)
    			return
    		}
    		err = json.Unmarshal([]byte(value), target)
    		if err != nil {
    			log.WithError(err).Errorf("%s json unmarshal failed", key)
    			return
    		}
    	}
    }
    
    tcc2.Watch(ctx, PcAppInfoKey, listenKey(ctx, &PcApps, PcAppInfoKey), time.Second*30)
    
    tcc2.Watch(ctx, MobileAppInfoKey, listenKey(ctx, &MobileApps, MobileAppInfoKey),time.Second*30)
    
  • 相关阅读:
    利用XShell上传、下载文件(使用sz与rz命令)
    我做的一个websocket的demo(php server)
    linux下如何实现mysql数据库每天自动备份定时备份
    php利用ob缓存机制实现页面静态化方法全解
    MySQL数据备份之mysqldump使用
    将jpg压缩成webp格式的图片
    ab网站压力测试命令的参数、输出结果的中文注解
    网页优化实例
    JQ 为未来元素添加事件处理器—事件委托
    Web前端优化最佳实践及工具集锦
  • 原文地址:https://www.cnblogs.com/xsirfly/p/11694269.html
Copyright © 2020-2023  润新知