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号