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?的主要内容,如果未能解决你的问题,请参考以下文章