zoukankan      html  css  js  c++  java
  • 函数柯里化的理解与应用

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

    实际实例

    在生产环境中,我们一般都会用到动态配置中心,一般动态配置中心的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)
    
  • 相关阅读:
    FileDescriptor详解
    java序列化
    ObjectInputStream和ObejctOutputStream
    ByteArrayOutputStream
    ByteArrayInputStream
    PipedInputStream/PipedOutputStream
    字节输入流
    反义
    贪婪和非贪婪
    MYSQL数据库优化
  • 原文地址:https://www.cnblogs.com/xsirfly/p/11694269.html
Copyright © 2011-2022 走看看