golang项目布局示例与真实代码实践插件库go-sample的使用
Golang项目布局示例与真实代码实践插件库go-sample的使用
go-sample简介
go-sample是一个包含真实代码的Go应用程序项目示例布局,采用了多种现代架构思想:
架构思想来源
该项目融合了以下架构思想:
- 清洁架构(The Clean Architecture)
- DDD, 六边形架构, 洋葱架构, CQRS等
- Go应用程序中的清洁架构应用
- 标准包布局
- Go应用结构设计
- 七年来编写Go HTTP服务的经验
环境要求
- git
- docker
安装
git clone https://github.com/zitryss/perfmon.git
使用
docker-compose up --build
示例代码结构
以下是go-sample的典型项目结构示例:
go-sample/
├── cmd/ # 主应用程序入口
│ └── app/ # 应用主程序
│ └── main.go # 主入口文件
├── internal/ # 私有应用程序代码
│ ├── app/ # 应用层
│ ├── domain/ # 领域层
│ ├── infrastructure/ # 基础设施层
│ └── interfaces/ # 接口层
├── pkg/ # 可复用的公共库代码
├── configs/ # 配置文件
├── deployments/ # 部署配置
├── scripts/ # 各种脚本
├── test/ # 测试文件
├── go.mod # Go模块定义
└── go.sum # 依赖校验
示例代码
// cmd/app/main.go
package main
import (
"context"
"log"
"os"
"os/signal"
"syscall"
"time"
"github.com/zitryss/go-sample/internal/app"
"github.com/zitryss/go-sample/internal/infrastructure/config"
)
func main() {
// 加载配置
cfg, err := config.Load()
if err != nil {
log.Fatalf("failed to load config: %v", err)
}
// 创建应用
application, err := app.New(cfg)
if err != nil {
log.Fatalf("failed to create app: %v", err)
}
// 创建上下文用于优雅关闭
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// 启动应用
go func() {
if err := application.Run(ctx); err != nil {
log.Printf("application stopped with error: %v", err)
cancel()
}
}()
// 等待中断信号
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
// 开始优雅关闭
log.Println("shutting down application...")
shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 30*time.Second)
defer shutdownCancel()
if err := application.Stop(shutdownCtx); err != nil {
log.Printf("failed to stop application gracefully: %v", err)
}
log.Println("application stopped")
}
// internal/app/app.go
package app
import (
"context"
"fmt"
"time"
"github.com/zitryss/go-sample/internal/domain"
"github.com/zitryss/go-sample/internal/infrastructure/config"
"github.com/zitryss/go-sample/internal/interfaces"
)
type Application struct {
cfg *config.Config
server *interfaces.Server
services *domain.Services
}
func New(cfg *config.Config) (*Application, error) {
// 初始化领域服务
services, err := domain.NewServices(cfg)
if err != nil {
return nil, fmt.Errorf("failed to create services: %w", err)
}
// 初始化接口层
server, err := interfaces.NewServer(cfg, services)
if err != nil {
return nil, fmt.Errorf("failed to create server: %w", err)
}
return &Application{
cfg: cfg,
server: server,
services: services,
}, nil
}
func (a *Application) Run(ctx context.Context) error {
// 启动HTTP服务器
if err := a.server.Run(ctx); err != nil {
return fmt.Errorf("server error: %w", err)
}
return nil
}
func (a *Application) Stop(ctx context.Context) error {
// 优雅关闭服务器
if err := a.server.Stop(ctx); err != nil {
return fmt.Errorf("failed to stop server: %w", err)
}
return nil
}
这个示例展示了go-sample项目的基本结构和代码组织方式,采用了分层架构设计,包括应用层、领域层、基础设施层和接口层。
更多关于golang项目布局示例与真实代码实践插件库go-sample的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复