函数柯里化的理解与应用

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

实际实例

在生产环境中,我们一般都会用到动态配置中心,一般动态配置中心的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)
posted @ 2019-10-17 19:26  xsirfly  阅读(727)  评论(0编辑  收藏  举报