Article  ID             Title         Content       UpdatedAt time.Time  CreatedAt time.Time repo(   IArticleRepo  Fetch(ctx context.Context, createdDate time.Time, num mysqlArticleRepository  DB *gorm.DB &mysqlArticleRepositoryDB num  err = m.DB.WithContext(ctx).Model(&models.Article).   Select(   Where( articleService  articleRepo repo.IArticleRepo &articleService   articleRepo: a,  num ==    num =   res, err = a.articleRepo.Fetch(ctx, createdDate, num) err !=      main(        db := app.InitDB()   repository := repo.NewMysqlArticleRepository(db)  articleService := service.NewArticleService(repository)  handler := handlers.NewArticleHandler(articleService)  router := api.NewRouter(handler)  engine := app.NewGinEngine()  server := app.NewServer(engine, router)  server.Start()(      *app. wire.   app.   repo.   service.   handlers.   api.   app.   app. &app.main(     * engine := app.NewGinEngine() db := app.InitDB() iArticleRepo := repo.NewMysqlArticleRepository(db) iArticleService := service.NewArticleService(iArticleRepo) articleHandler := handlers.NewArticleHandler(iArticleService) router := api.NewRouter(articleHandler) server := app.NewServer(engine, router) server  server.-source .\\repo\\repo.-mock-source .\\service\\service.-mock


  err error db *sql.DB db, mock, err = sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual)) err !=       gormDB, err = gorm.Open(mysql.New(mysql.Config   SkipInitializeWithVersion:    Conn:                      db, ), &gorm.Config) != err    log.Fatalf(   createAt := time.Now() updateAt := time.Now()  articles = []models.Article        limit :=  mock, db := getSqlMock() mock.ExpectQuery(   WithArgs(createAt).   WillReturnRows(sqlmock.NewRows([]     AddRow(articles[     AddRow(articles[ repository := NewMysqlArticleRepository(db) result, err := repository.Fetch(context.TODO(), createAt, limit) assert.Nil(t, err) assert.Equal(t, articles, result)*  defer ctl. now := time. mockRepo := mock. gomock.   mockRepo.EXPECT(). )  service :=  fetch, _ := service. fmt. ctl := gomock.NewController(t) ctl.Finish() createAt, _ := time.Parse( mockService := mock.NewMockIArticleService(ctl) gomock.InOrder(   mockService.EXPECT().Fetch(gomock.Any(), createAt,  ) article := NewArticleHandler(mockService) gin.SetMode(gin.TestMode)   r := gin.Default() r.GET( req, err := http.NewRequest(http.MethodGet,  err !=    t.Fatalf(  w := httptest.NewRecorder()  r.ServeHTTP(w, req)  w.Code != http.StatusOK    t.Fatalf( 



五、总结


以上就是我对golang的项目中发现问题的一点点总结与思考,思考的先不管对不对,总归是解决了我们当下的一些问题。不过,项目总归是需要不断重构完善的,所以下次有问题的时候下次再改呗。


对于我上面的总结和描述感觉有不对的地方,请随时指出来一起讨论。


项目代码位置:https://github.com/devYun/go-clean-architecture


参考资料:

1.The Clean Architecture

2.bxcodec/go-clean-arch

3.Trying Clean Architecture on Golang

4.理解一下依赖注入,以及如何用wire



 作者简介


罗志赟

腾讯后台开发工程师

腾讯后台开发工程师,负责IEG游戏推荐相关后端业务,深入研究过Go runtime相关代码,喜欢专研技术细节,探索技术中有趣的实践分享给大家。



 推荐阅读


高并发场景下,6种方案,保证缓存和数据库的最终一致性!

颠覆Kafka的统治,新一代云原生消息系统Pulsar震撼来袭!

七年激荡!Serverless的下一站将去往何方?

基于流计算Oceanus和Elasticsearch Service构建百亿级实时监控系统



以上是关于超实用教程!一探Golang怎样践行Clean Architecture?的主要内容,如果未能解决你的问题,请参考以下文章