在公开环境中构建最小的 Go 框架 (v0.1.3)

发布: (2026年1月20日 GMT+8 13:58)
5 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的完整文本内容,我将为您将其翻译成简体中文并保留原始的格式、Markdown 语法以及技术术语。谢谢!

介绍

大多数 Go Web 框架会引入数十个依赖——Gin 有 9 个直接依赖,Echo 有 11 个,Fiber 有 15 个——因此你的 go.mod 很快就会像电话簿一样。Marten 采用了不同的方式:它只使用 Go 本身提供的功能(例如 net/httpencoding/json)。没有外部包,没有供应商锁定。

完整 API 示例

package main

import (
    "github.com/gomarten/marten"
    "github.com/gomarten/marten/middleware"
)

func main() {
    app := marten.New()

    app.Use(middleware.Logger)
    app.Use(middleware.Recover)

    app.GET("/", func(c *marten.Ctx) error {
        return c.OK(marten.M{"message": "Hello, World!"})
    })

    app.GET("/users/:id", func(c *marten.Ctx) error {
        id := c.ParamInt("id")
        return c.OK(marten.M{"id": id})
    })

    app.Run(":8080")
}

路由

Marten 使用基数树路由器来实现高效的路径匹配。它支持:

  • 路径参数 (:id)
  • 通配符 (*filepath)
  • 路由分组
api := app.Group("/api/v1")
api.GET("/users", listUsers)
api.GET("/users/:id", getUser)
api.POST("/users", createUser)

Middleware

Middleware in Marten is just a function that wraps a handler:

func Timer(next marten.Handler) marten.Handler {
    return func(c *marten.Ctx) error {
        start := time.Now()
        err := next(c)
        log.Printf("took %v", time.Since(start))
        return err
    }
}

Built‑in Middleware

Marten ships with 14 built‑in middleware components:

  • Logger
  • Recover
  • CORS
  • RateLimit
  • BasicAuth
  • Timeout
  • Secure
  • BodyLimit
  • Compress
  • ETag
  • RequestID
  • Static
  • NoCache

Context (Ctx) 使用

每个请求都会从 sync.Pool 中获取一个 Ctx 对象,从而减少分配并保持内存使用低:

func handler(c *marten.Ctx) error {
    // Path parameters
    id := c.Param("id")

    // Query parameters
    page := c.QueryInt("page")

    // JSON binding
    var user User
    c.Bind(&user)

    // Response helpers
    return c.OK(user)
}

静态文件服务 (v0.1.3)

最新发布添加了完整功能集的静态文件服务:

app.Use(middleware.StaticWithConfig(middleware.StaticConfig{
    Root:   "./public",
    Prefix: "/static",
    MaxAge: 3600,
    Browse: false,
}))

功能包括内容类型检测、HTTP 缓存(If-Modified-Since)、目录浏览以及防止目录遍历攻击。

性能基准

对比 Gin、Echo 和 Chi 的基准测试显示 Marten 也不逊色:

基准MartenGinEchoChi
静态路由1464 ns/op1336 ns/op1436 ns/op2202 ns/op
参数路由1564 ns/op1418 ns/op1472 ns/op2559 ns/op
JSON 响应1755 ns/op2050 ns/op1835 ns/op1868 ns/op

不是最快的,但具有竞争力——且没有任何依赖。

构建生产就绪的 API

app := marten.New()

app.Use(
    middleware.RequestID,
    middleware.Logger,
    middleware.Recover,
    middleware.CORS(middleware.DefaultCORSConfig()),
    middleware.RateLimit(middleware.RateLimitConfig{
        Max:    100,
        Window: time.Minute,
    }),
)

api := app.Group("/api/v1")
api.GET("/users", listUsers)
api.POST("/users", createUser, authMiddleware)

SPA 回退

// API routes
app.GET("/api/users", listUsers)

// Serve static files
app.Use(middleware.Static("./dist"))

// SPA fallback
app.NotFound(func(c *marten.Ctx) error {
    if strings.HasPrefix(c.Path(), "/api/") {
        return c.NotFound("endpoint not found")
    }
    // Serve index.html for client‑side routing
    return c.HTML(200, indexHTML)
})

测试

Marten v0.1.3 包含 325 个测试,覆盖范围包括:

  • 每个组件的单元测试
  • 面向真实工作流的集成测试
  • 进行 1,000+ 并发请求的压力测试
  • 边缘情况和错误条件

所有测试均通过 Go 的竞争检测器;未发现已知的内存泄漏。

Marten 不提供的功能

  • ORM 集成 – 直接使用 database/sql
  • 模板引擎 – 使用标准库中的 html/template
  • 验证库 – 自行编写或导入第三方包
  • WebSocket 支持 – 计划在未来版本中实现

哲学

如果标准库能够完成,就使用标准库。如果需要更多功能,请自行添加——仍然保持零依赖的约束。

Future Releases

  • WebSocket 中间件
  • 模板渲染助手
  • 会话管理中间件
  • 增强的静态文件服务选项

所有这些都遵循相同的零依赖理念。

安装

go get github.com/gomarten/marten@v0.1.3

查看关于 CRUD API、JWT 认证、文件服务器等的示例。

结论

Marten 并不是想取代 Gin 或 Echo;它是一次极简主义的实验——证明你可以在不引入整个世界的情况下构建一个有能力的 Web 框架。有时,少即是多。

链接

  • GitHub:
  • 文档:
  • 讨论:
Back to Blog

相关文章

阅读更多 »

Go 的秘密生活:Context 包

如何停止失控的 goroutine 并防止内存泄漏。第 16 章:了解何时退出。档案室寂静无声,只有机架中服务器的嗡鸣声……