Golang项目架构分层示例
/your_project
│── /api                
│   ├── api.go				  # API 路由管理
│── /cmd
│   └── main.go				  # 入口
│── /configs
│   ├── config.go             # 读取配置
│   ├── config.yaml           # 配置文件
│   ├── config_test.yaml      # 测试环境配置
│── /internal
│   ├── /handlers         	  # 控制层
│   │   ├── hello_handler.go
│   │   ├── user_handler.go
│   ├── /service              # 业务逻辑层
│   │   ├── user_service.go
│   ├── /repo                 # 数据访问层
│   │   ├── user_repo.go
│   ├── /models           	  # 数据库模型
│   │   ├── user.go
│── /pkg
│   ├── /database             # 数据库连接
│   │   ├── database.go
│   ├── /logger               # 日志
│   │   ├── logger.go
│── go.mod
│── go.sum
└── README.md
如果需要添加一些公共组件,那么可以……
/pkg
│── /utils         # 通用工具函数
│── /middleware    # Gin 中间件
│── /errors        # 统一错误管理
│── /auth          # 认证鉴权
│── /cache         # 缓存封装
│── /httpclient    # HTTP 客户端封装
│── /config        # 配置管理
func main() {
	fmt.Println("start")
	// 加载配置
	if err := configs.LoadConfig("configs/config.yaml"); err != nil {
		fmt.Println("Failed to load config:", err)
		os.Exit(1)
	}
	fmt.Println("Success to load config")
	// 初始化日志
	log.InitLogger()
	defer func() {
		if err := log.Logger.Sync(); err != nil {
			fmt.Println("Failed to sync logger:", err)
		}
	}()
	// 连接数据库
	db := database.ConnectDatabase()
	// DI account handler
	accountRepo := &repo.AccountRepo{DB: db}
	accountService := &service.AccountService{Repo: accountRepo}
	accountHandler := &handlers.AccountHandler{Service: accountService}
	// DI hello handler
	helloHandler := &handlers.HelloHandler{}
	// 设置 API 路由
	routers := api.SetRouters(helloHandler, accountHandler)
	port := configs.AppConfig.Server.Port
	server := &http.Server{
		Addr:    ":" + port,
		Handler: routers,
	}
	// 监听退出信号
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	// 启动 HTTP 服务器
	ctx, srvCancel := context.WithCancel(context.Background())
	go func() {
		log.Logger.Info("Server is starting: ", port)
		if err := server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
			log.Logger.Error("Server startup failed", zap.Error(err))
			srvCancel() // 触发 `context` 取消,确保 `server.Shutdown(ctx)` 被调用
		}
	}()
	// 等待退出信号
	<-quit
	log.Logger.Info("Shutting down server...")
	// 关闭 HTTP 服务器
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	if err := server.Shutdown(ctx); err != nil {
		log.Logger.Fatal("Server forced to shutdown", zap.Error(err))
		os.Exit(1)
	}
	log.Logger.Info("Server exited properly")
}
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号