首页 > 其他 > 详细

函数柯里化的理解与应用

时间:2019-10-17 19:39:35      阅读:63      评论:0      收藏:0      [点我收藏+]

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

实际实例

在生产环境中,我们一般都会用到动态配置中心,一般动态配置中心的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)

函数柯里化的理解与应用

原文:https://www.cnblogs.com/xsirfly/p/11694269.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!