go一个代码优化示例

go一个代码优化示例 优化后package traintask import ( time gitea.super-study.com/ys-study/gotrain/beapi/common gitea.super-study.com/ys-study/gotrain/beapi/db/apiconst/planconst gitea.super-study.com/ys-study/gotrain/beapi/db/dbdao/plandao gitea.super-study.com/ys-study/gotrain/beapi/db/dbentity/planentity gitea.super-study.com/ys-study/gotrain/beapi/db/dbfacade/planfacade gitea.super-study.com/ys-study/gotrain/beapi/gotool/gobatch/batchframe gitea.super-study.com/ys-study/gotrain/beapi/trainframe/model gitea.super-study.com/ys-study/gotrain/beapi/trainframe/repository gitea.super-study.com/ys-study/gotrain/beapi/trainframe/service gitee.com/gowebframe3/webframe.git/goconfig/base/basedto gitee.com/gowebframe3/webframe.git/goconfig/ichublog/golog gitee.com/gowebframe3/webframe.git/goweb/pagemodel github.com/gin-gonic/gin ) type TrainPlanTask struct { basedto.BaseEntitySingle batchframe.BatchService } func NewTrainPlanTask() *TrainPlanTask { return TrainPlanTask{} } func (self *TrainPlanTask) QueryModelCancelOverdue() *pagemodel.PageResult[*planentity.TrainPlan] { var dao plandao.FindBeanTrainPlanDao() now : time.Now().Add(30 * time.Minute) before : now.Add(-24 * time.Hour * 30) dao.DbIn(status, model.StatusNotInvited, model.StatusNotStarted) dao.DbBetween(end_at, before, now) dao.DbNe(type, model.TrainTypeSelfScreen) return dao.QueryModel() } func (self *TrainPlanTask) CancelOverdueFn() func() error { return func() error { golog.Stat(cancel overdue fn) // 查询超时未开始的训练课程 var ret self.QueryModelCancelOverdue() if ret.NotExistRecord() { golog.Info(CancelOverdueFn no overtime processing train-plan exist!, time.Now()) return ret.Result2Error() } for _, plan : range ret.Data { golog.Info(取消超时未开始的训练课程 - 课程号: , 学员ID: , 开始时间: , plan.TrainPlanId, plan.StudentId, plan.StartdAt) user, err : repository.FindBeanrepository().User().GetUserByID(plan.StudentId) if err ! nil { golog.Info(cancelOverdueTrainings failed to get user by ID , plan.StudentId, err) continue } // 使用学员身份取消训练 ctx : gin.Context{} common.SetUser(ctx, user) if err : service.FindBeantrainPlanService().CancelTrainPlan(ctx, plan.Id, 超时未应邀,已自动取消); err ! nil { return err } } return ret.Result2Error() } } func (self *TrainPlanTask) QueryModelAutoCloseOverdue() *pagemodel.PageResult[*planentity.TrainPlan] { var dao plandao.FindBeanTrainPlanDao() now : time.Now().Add(-5 * time.Minute) before : now.Add(-30 * 24 * time.Hour) dao.DbIn(status, model.StatusInProgress) dao.DbBetween(end_at, before, now) dao.DbNe(type, model.TrainTypeSelfScreen) return dao.QueryModel() } func (self *TrainPlanTask) AutoCloseOverdueFn() func() error { return func() error { golog.Stat(AutoCloseOverdueFn ) var ret self.QueryModelAutoCloseOverdue() if ret.NotExistRecord() { golog.Info(AutoCloseOverdueTrainingFn no overtime processing train-plan exist!, time.Now()) return ret.Result2Error() } for _, plan : range ret.Data { golog.Info(取消超时未开始的训练课程 - 课程号: , 学员ID: , 开始时间: , plan.TrainPlanId, plan.StudentId, plan.StartdAt) user, err : repository.FindBeanrepository().User().GetUserByID(plan.StudentId) if err ! nil { golog.Warn(autoclose_overdue_trainings failed to get user by ID , plan.StudentId, err) continue } // 使用学员身份取消训练 ctx : gin.Context{} common.SetUser(ctx, user) if plan.Status planconst.StatusInProgress { updatePlan : model.UpdateTrainPlan{ Status: model.StatusCompleted, ID: plan.Id, Now: time.Now(), Progressing: 0, StudentId: plan.StudentId, } //err : TrainPlanService.UpdateStatus(ctx, updatedTrainPlan) ret : planfacade.FindBeanTrainPlanFacade().UpdateStatus(ctx, updatePlan) if ret.IsFailed() { golog.Warn(autoclose_overdueTrainings failed to update trainPlansstatus for studentID , plan.StudentId, err) } } } return ret.Result2Error() } } func (self *TrainPlanTask) CancelOverdue() error { return self.BatchRunLocker(self.CancelOverdueFn()) } func (self *TrainPlanTask) AutoCloseOverdue() error { return self.BatchRunLocker(self.AutoCloseOverdueFn()) } func (self *TrainPlanTask) BatchTaskOverdueTrain() error { var err self.CancelOverdue() if err ! nil { golog.Error(BatchTaskOverdueTrain CancelOverdue err: , err) } return self.AutoCloseOverdue() }type BatchService struct { basedto.BaseEntitySingle common.BaseService } func NewBatchService() *BatchService { return BatchService{} } func (self *BatchService) BatchRunLocker(batch func() error) error { // 用锁限制只能单个执行 lockValue : time.Now().Format(20060102150405) - strconv.Itoa(time.Now().Nanosecond()) if !database.FindBeanRedisDB().AcquireLock(cron:cancel_overdue_trainings, lockValue, time.Minute) { return fmt.Errorf(cron:cancel_overdue_trainings lock failed) } defer func() { if err : recover(); err ! nil { golog.Info(recovered from panic: , err) } database.FindBeanRedisDB().ReleaseLock(cron:cancel_overdue_trainings, lockValue) }() return batch() }优化前func CancelOverdueTrainings() { // 用锁限制只能单个执行 lockValue : time.Now().Format(20060102150405) - strconv.Itoa(time.Now().Nanosecond()) if !rdb.AcquireLock(cron:cancel_overdue_trainings, lockValue, time.Minute) { return } defer func() { if err : recover(); err ! nil { log.Printf(recovered from panic: %v, err) } rdb.ReleaseLock(cron:cancel_overdue_trainings, lockValue) }() // 查询超时未开始的训练课程 now : time.Now() before : now.Add(-24 * time.Hour * 30) var plans []model.TrainPlan // startd_at 有索引 Repository.TrainPlan().GetDB().Model(plans).Where(end_at between ? and ? and status in (?, ?) and type ! ?, before, now, model.StatusNotInvited, model.StatusNotStarted, model.TrainTypeSelfScreen).Find(plans) for _, plan : range plans { golog.Info(取消超时未开始的训练课程 - 课程号: , 学员ID: , 开始时间: , plan.TrainPlanID, plan.StudentID, plan.StartdAt) user, err : Repository.User().GetUserByID(plan.StudentID) if err ! nil { golog.Info(cancelOverdueTrainings failed to get user by ID , plan.StudentID, err) continue } // 使用学员身份取消训练 ctx : gin.Context{} common.SetUser(ctx, user) if plan.Status model.StatusNotInvited { TrainPlanService.CancelTrainPlan(ctx, plan.ID, 超时未应邀,已自动取消) continue } // 处理超结束时间 , 但未开始的训练课程 if now.After(plan.EndAt) { TrainPlanService.CancelTrainPlan(ctx, plan.ID, 超时未开始,已自动取消) } } }func AutoCloseOverdueTrainings() { golog.Info(autoCloseOverdueTrainings, time.Now()) // 用锁限制只能单个执行 lockValue : time.Now().Format(20060102150405) - strconv.Itoa(time.Now().Nanosecond()) if !rdb.AcquireLock(cron:autoclose_overdue_trainings, lockValue, time.Minute) { return } defer func() { if err : recover(); err ! nil { log.Printf(recovered from panic: %v, err) } rdb.ReleaseLock(cron:autoclose_overdue_trainings, lockValue) }() // 查询超时未开始的训练课程 now : time.Now().Add(24 * time.Hour) before : now.Add(-30 * 24 * time.Hour) // 7 天前 var plans []model.TrainPlan var planss []model.TrainPlan // startd_at 有索引 Repository.TrainPlan().GetDB().Model(plans).Where(startd_at between ? and ? and status ? and type ! ?, before, now, model.StatusInProgress, model.TrainTypeSelfScreen).Find(plans) for _, plan : range plans { log.Printf(取消超时未开始的训练课程 - 课程号:%v, 学员ID:%v , 开始时间:%v, plan.TrainPlanID, plan.StudentID, plan.StartdAt) user, err : Repository.User().GetUserByID(plan.StudentID) if err ! nil { golog.Warn(autoclose_overdue_trainings failed to get user by ID , plan.StudentID, err) continue } // 使用学员身份取消训练 ctx : gin.Context{} common.SetUser(ctx, user) var over now.Sub(plan.EndAt).Minutes() apiconst.AUTO_CLOSE_TIME_M if over plan.Status model.StatusInProgress { planss append(planss, plan) updatedTrainPlan : model.UpdateTrainPlan{ Status: model.StatusCompleted, ID: plan.ID, Now: now, Progressing: 0, StudentId: plan.StudentID, } //err : TrainPlanService.UpdateStatus(ctx, updatedTrainPlan) ret : planfacade.FindBeanTrainPlanFacade().UpdateStatus(ctx, updatedTrainPlan) if ret.IsFailed() { golog.Warn(autoclose_overdueTrainings failed to update trainPlansstatus for studentID , plan.StudentID, err) } } } if len(planss) 0 { golog.Info(autoclose_overdue_trainings no overtime processing train-plan exist!, time.Now()) } }