GO语言defer与锁配合使用的小技巧


GO语言defer与锁配合使用的小技巧:

    在使用redsync(红锁)或其他任何锁之类的东西时,可以将其整段代码包含在 func(){}() 里面

        好处在于:

            1.如果需要锁定的代码并没有直到函数结束,则不需要浪费锁定的时间,用到哪锁到哪

            2.如果不用这种方法,又不想浪费锁定时间,就需要在每个return前手动释放一次锁,很麻烦,可读性也差

        

        示例如下:

   //
   //
   //其他正常代码
   //
   //
   func() {
      mutexname := fmt.Sprintf("erp_stock-mutex:%d", req.SkuId)
      mutex := global.Rs.NewMutex(mutexname)
      if err := mutex.Lock(); err != nil {
         zap.S().Infof("获取锁失败:%+v", err)
         global.Error(c, "服务器繁忙,设置失败")
      }
      defer mutex.Unlock() //关键在于此
      var sku model.Sku
      if result := global.Db.Model(&model.Sku{}).Where(&model.Sku{
         ID: req.SkuId,
      }).First(&sku); result.RowsAffected == 0 {
         global.Error(c, "规格不存在")
         return
      }
      *sku.Stock -= *req.Nums
      *sku.Sale += *req.Nums
      if result := global.Db.Save(&sku); result.RowsAffected == 0 {
         global.Error(c, "设置库存失败")
         return
      }
   }()
   
    //
      //
      //其他正常代码
      //
      //


最后编辑于:2022/08/30作者: 牛逼PHP

发表评论