Files
go-common/QUICKSTART.md

6.3 KiB
Raw Blame History

快速开始指南

5分钟快速上手 GoCommon 工具库。

1. 安装

# 配置私有仓库
go env -w GOPRIVATE=git.toowon.com

# 安装最新版本
go get git.toowon.com/jimmy/go-common@latest

2. 创建配置文件

创建 config.json

{
    "database": {
        "type": "mysql",
        "host": "localhost",
        "port": 3306,
        "user": "root",
        "password": "password",
        "database": "mydb"
    },
    "redis": {
        "host": "localhost",
        "port": 6379
    },
    "logger": {
        "level": "info",
        "output": "stdout",
        "async": true
    }
}

3. 创建主程序

创建 main.go

package main

import (
    "net/http"
    "time"
    
    "git.toowon.com/jimmy/go-common/factory"
    "git.toowon.com/jimmy/go-common/middleware"
    commonhttp "git.toowon.com/jimmy/go-common/http"
)

func main() {
    // 从配置文件创建工厂(黑盒模式)
    fac, err := factory.NewFactoryFromFile("./config.json")
    if err != nil {
        panic(err)
    }
    
    // 获取logger
    logger, _ := fac.GetLogger()
    defer logger.Close()
    
    // 配置中间件链
    chain := middleware.NewChain(
        middleware.Recovery(&middleware.RecoveryConfig{Logger: logger}),
        middleware.Logging(&middleware.LoggingConfig{Logger: logger}),
        middleware.RateLimitByIP(100, time.Minute),
        middleware.CORS(nil),
        middleware.Timezone,
    )
    
    // 注册路由
    http.Handle("/api/hello", chain.ThenFunc(handleHello))
    http.Handle("/api/users", chain.ThenFunc(handleUsers))
    
    // 启动服务
    logger.Info("Server started on :8080")
    http.ListenAndServe(":8080", nil)
}

// API处理器 - 问候接口
func handleHello(w http.ResponseWriter, r *http.Request) {
    h := commonhttp.NewHandler(w, r)
    
    h.Success(map[string]interface{}{
        "message": "Hello, World!",
        "timezone": h.GetTimezone(),
    })
}

// API处理器 - 用户列表(带分页)
func handleUsers(w http.ResponseWriter, r *http.Request) {
    h := commonhttp.NewHandler(w, r)
    
    // 解析分页参数
    pagination := h.ParsePaginationRequest()
    page := pagination.GetPage()
    size := pagination.GetSize()
    
    // 模拟数据
    users := []map[string]interface{}{
        {"id": 1, "name": "Alice"},
        {"id": 2, "name": "Bob"},
    }
    total := int64(100)
    
    // 返回分页数据
    h.SuccessPage(users, total, page, size)
}

4. 运行

go run main.go

5. 测试

# 测试问候接口
curl http://localhost:8080/api/hello

# 测试分页接口
curl "http://localhost:8080/api/users?page=1&page_size=10"

# 测试时区
curl -H "X-Timezone: America/New_York" http://localhost:8080/api/hello

# 测试限流(快速请求多次)
for i in {1..150}; do curl http://localhost:8080/api/hello; done

6. 常见使用场景

场景1使用数据库

// 获取数据库连接
db, _ := fac.GetDatabase()

// 使用GORM查询
var users []User
db.Find(&users)

场景2使用Redis

ctx := context.Background()

// 设置值
fac.RedisSet(ctx, "key", "value", time.Hour)

// 获取值
value, _ := fac.RedisGet(ctx, "key")

// 删除值
fac.RedisDelete(ctx, "key")

场景3发送邮件

// 发送简单邮件
fac.SendEmail(
    []string{"user@example.com"},
    "测试邮件",
    "这是邮件正文",
)

// 发送HTML邮件
fac.SendEmail(
    []string{"user@example.com"},
    "测试邮件",
    "纯文本内容",
    "<h1>HTML内容</h1>",
)

场景4上传文件

ctx := context.Background()

// 打开文件
file, _ := os.Open("test.jpg")
defer file.Close()

// 上传文件自动选择OSS或MinIO
url, _ := fac.UploadFile(ctx, "images/test.jpg", file, "image/jpeg")

// 获取文件URL
url, _ := fac.GetFileURL("images/test.jpg", 3600) // 1小时后过期

场景5记录日志

// 简单日志
fac.LogInfo("用户登录成功")
fac.LogError("登录失败: %v", err)

// 带字段的日志
fac.LogInfof(map[string]interface{}{
    "user_id": 123,
    "action": "login",
}, "用户操作")

场景6时间处理

import "git.toowon.com/jimmy/go-common/datetime"

// 获取当前时间(带时区)
timezone := h.GetTimezone()
now := datetime.Now(timezone)

// 格式化时间
str := datetime.FormatDateTime(now)

// 解析时间
t, _ := datetime.ParseDateTime("2024-01-01 00:00:00", timezone)

// 时间计算
tomorrow := datetime.AddDays(now, 1)
startOfDay := datetime.StartOfDay(now, timezone)

场景7数据库迁移独立工具

# 1. 复制模板到项目
cp templates/migrate/main.go cmd/migrate/

# 2. 创建迁移文件 migrations/20240101000001_create_users.sql

# 3. 编译并使用
go build -o bin/migrate cmd/migrate/main.go
./bin/migrate up        # 执行迁移
./bin/migrate status    # 查看状态

特点:独立工具,零耦合,生产就绪

完整指南:MIGRATION.md

7. 更多文档

常见问题

Q: 如何自定义中间件配置?

查看 中间件文档 了解详细配置选项。

Q: 如何使用数据库迁移?

查看 迁移工具文档 了解数据库版本管理。

Q: 支持哪些数据库?

支持 MySQL、PostgreSQL、SQLite。

Q: 日志如何配置异步模式?

在配置文件中设置 "async": true,或通过代码配置:

loggerConfig := &config.LoggerConfig{
    Async: true,
    BufferSize: 1000,
}

Q: 如何按用户ID限流

limiter := middleware.NewTokenBucketLimiter(100, time.Minute)
rateLimitConfig := &middleware.RateLimitConfig{
    Limiter: limiter,
    KeyFunc: func(r *http.Request) string {
        return r.Header.Get("X-User-ID")
    },
}
chain := middleware.NewChain(
    middleware.RateLimit(rateLimitConfig),
)

下一步

恭喜!你已经掌握了 GoCommon 的基本使用。

建议阅读:

  1. 中间件文档 - 了解更多中间件配置
  2. 工厂模式文档 - 深入了解黑盒模式
  3. 示例代码 - 查看更多实际示例