在公开环境中构建最小的 Go 框架 (v0.1.3)
Source: Dev.to
请提供您希望翻译的完整文本内容,我将为您将其翻译成简体中文并保留原始的格式、Markdown 语法以及技术术语。谢谢!
介绍
大多数 Go Web 框架会引入数十个依赖——Gin 有 9 个直接依赖,Echo 有 11 个,Fiber 有 15 个——因此你的 go.mod 很快就会像电话簿一样。Marten 采用了不同的方式:它只使用 Go 本身提供的功能(例如 net/http、encoding/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:
LoggerRecoverCORSRateLimitBasicAuthTimeoutSecureBodyLimitCompressETagRequestIDStaticNoCache
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 也不逊色:
| 基准 | Marten | Gin | Echo | Chi |
|---|---|---|---|---|
| 静态路由 | 1464 ns/op | 1336 ns/op | 1436 ns/op | 2202 ns/op |
| 参数路由 | 1564 ns/op | 1418 ns/op | 1472 ns/op | 2559 ns/op |
| JSON 响应 | 1755 ns/op | 2050 ns/op | 1835 ns/op | 1868 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:
- 文档:
- 讨论: