ZBLOG

func GetUserHealthDiary(userId int) ai_common.UserHealthDiary { resp := ai_common.UserHealthDiary{} date := time.Now().Format("2026-01-02") dbData, isExist := dbrespository.GetUserHealthDiaryByUserId(userId, date) if !isExist { // create tes...

你可以使用 Go 的协程(goroutine)和通道(channel)来优化 GetUserHealthDiary 函数,以实现并发处理。下面是一个重构后的版本,该版本将一些耗时的调用放入协程中,从而提升性能。

  1. func GetUserHealthDiary(userId int) ai_common.UserHealthDiary {
  2. resp := ai_common.UserHealthDiary{}
  3. date := time.Now().Format("2006-01-02") // 使用正确的日期格式
  4. dbData, isExist := dbrespository.GetUserHealthDiaryByUserId(userId, date)
  5. if !isExist {
  6. // create test data
  7. dbData.UserID = userId
  8. resp.RecordDate = dbData.RecordDate // 记录健康日记的日期,默认是当天
  9. dbrespository.CreateUserHealthDiary(&dbData)
  10. }
  11. resp.RecordDate = dbData.RecordDate // 记录健康日记的日期,默认是当天
  12. var wg sync.WaitGroup
  13. var mu sync.Mutex // 用于保护对 resp 的写操作
  14. wg.Add(1)
  15. go func() {
  16. defer wg.Done()
  17. resp.HappinessIndex = getHappinessIndex(dbData.HappinessIndexID)
  18. mu.Lock()
  19. dbData.HappinessIndexID = resp.HappinessIndex.ID
  20. mu.Unlock()
  21. }()
  22. wg.Add(1)
  23. go func() {
  24. defer wg.Done()
  25. resp.PsychologicalPressure = getPsychologicalPressure(dbData.PsychologicalPressureID)
  26. mu.Lock()
  27. dbData.PsychologicalPressureID = resp.PsychologicalPressure.ID
  28. mu.Unlock()
  29. }()
  30. wg.Add(1)
  31. go func() {
  32. defer wg.Done()
  33. resp.WorkStudyIntensity = getWorkStudyIntensity(dbData.WorkStudyIntensityID)
  34. mu.Lock()
  35. dbData.WorkStudyIntensityID = resp.WorkStudyIntensity.ID
  36. mu.Unlock()
  37. }()
  38. wg.Add(1)
  39. go func() {
  40. defer wg.Done()
  41. resp.OvertimeSituation = getOvertimeSituation(dbData.OvertimeSituationID)
  42. mu.Lock()
  43. dbData.OvertimeSituationID = resp.OvertimeSituation.ID
  44. mu.Unlock()
  45. }()
  46. wg.Add(1)
  47. go func() {
  48. defer wg.Done()
  49. resp.ElectronicDeviceTime = getElectronicDeviceTime(dbData.ElectronicDeviceTimeID)
  50. mu.Lock()
  51. dbData.ElectronicDeviceTimeID = resp.ElectronicDeviceTime.ID
  52. mu.Unlock()
  53. }()
  54. wg.Add(1)
  55. go func() {
  56. defer wg.Done()
  57. resp.ExerciseIntensity = getExerciseIntensity(dbData.ExerciseIntensityID)
  58. mu.Lock()
  59. dbData.ExerciseIntensityID = resp.ExerciseIntensity.ID
  60. mu.Unlock()
  61. }()
  62. for _, healthDiaryBadLiving := range dbData.HealthDiaryBadLiving {
  63. resp.BadLivingBehaviors = append(resp.BadLivingBehaviors, healthDiaryBadLiving.BadLiving)
  64. }
  65. if len(dbData.HealthDiaryBadLiving) == 0 {
  66. // create test data
  67. }
  68. wg.Add(1)
  69. go func() {
  70. defer wg.Done()
  71. resp.BadSocialEmotions = getBadSocialEmotions(dbData.BadSocialEmotionsID)
  72. mu.Lock()
  73. dbData.BadSocialEmotionsID = resp.BadSocialEmotions.ID
  74. mu.Unlock()
  75. }())
  76. //其他数据项继续添加协程进行处理...
  77. // 在这里也可以添加所有其余需要通过函数获取的数据项
  78. // 等待所有协程完成
  79. wg.Wait()
  80. return resp
  81. }

在这个例子中,我使用了 sync.WaitGroup 来等待所有协程完成,并使用 sync.Mutex 来确保对共享资源 respdbData 的安全访问。这种方式可以提高函数的性能,特别是在有很多独立的数据项需要获取时。

请注意,确保被调用的每个函数 (getHappinessIndex, getPsychologicalPressure, 等等) 是线程安全的,以避免竞态条件。如果它们不是线程安全的,你可能需要进一步改进或考虑如何更好地设计这些函数。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=22672

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?