viper库的使用 在阅读https://github.com/bxcodec/go-clean-arch时,发现了viper库,这是一个加载配置时使用的库,可以避免定义struct
errgroup 下面这块的写法可以学习下,来自https://github.com/bxcodec/go-clean-arch/blob/master/article/usecase/article_ucase.go
这个函数实现的功能就是根据data里数组的各个ID,查询其具体内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 func (a *articleUsecase) fillAuthorDetails(c context.Context, data []domain.Article) ([]domain.Article, error ) { g, ctx := errgroup.WithContext(c) mapAuthors := map [int64 ]domain.Author{} for _, article := range data { mapAuthors[article.Author.ID] = domain.Author{} } chanAuthor := make (chan domain.Author) for authorID := range mapAuthors { authorID := authorID g.Go(func () error { res, err := a.authorRepo.GetByID(ctx, authorID) if err != nil { return err } chanAuthor <- res return nil }) } go func () { err := g.Wait() if err != nil { logrus.Error(err) return } close (chanAuthor) }() for author := range chanAuthor { if author != (domain.Author{}) { mapAuthors[author.ID] = author } } if err := g.Wait(); err != nil { return nil , err } for index, item := range data { if a, ok := mapAuthors[item.Author.ID]; ok { data[index].Author = a } } return data, nil }
数据库抽象 总结起来就是数据库的操作需要抽象成interface,对外提供方法供API端调用
名字可以参考定义为XXXUsecase,XXX就是关联的数据库模型,比如对文章的操作就是articleUsecase
启动文件位置 启动的main.go可以放到单独的目录,比如app目录