gofiber/fiber

GitHub: gofiber/fiber

Fiber 是一款受 Express 启发、基于 Fasthttp 构建的高性能 Go Web 框架,专注于极速开发与零内存分配。

Stars: 39321 | Forks: 1958

Fiber
Codecov

Fiber is an Express inspired web framework built on top of Fasthttp, the fastest HTTP engine for Go. Designed to ease things up for fast development with zero memory allocation and performance in mind.

## ⚙️ 安装 Fiber 需要 **Go 版本 `1.25` 或更高版本** 才能运行。如果您需要安装或升级 Go,请访问 [Go 官方下载页面](https://go.dev/dl/)。要开始设置您的项目,请为您的项目创建一个新目录并进入其中。然后,通过在终端中执行以下命令,使用 Go modules 初始化您的项目: ``` go mod init github.com/your/repo ``` 要了解更多关于 Go modules 及其工作原理的信息,您可以查阅 [Using Go Modules](https://go.dev/blog/using-go-modules) 博客文章。 设置好项目后,您可以使用 `go get` 命令安装 Fiber: ``` go get -u github.com/gofiber/fiber/v3 ``` 此命令会获取 Fiber 包并将其添加到项目的依赖项中,让您可以开始使用 Fiber 构建 Web 应用程序。 ## ⚡️ 快速入门 上手 Fiber 非常容易。这是一个基础示例,用于创建一个简单的 Web 服务器,它在根路径上响应 "Hello, World 👋!"。此示例演示了初始化一个新的 Fiber app、设置路由以及启动服务器。 ``` package main import ( "log" "github.com/gofiber/fiber/v3" ) func main() { // Initialize a new Fiber app app := fiber.New() // Define a route for the GET method on the root path '/' app.Get("/", func(c fiber.Ctx) error { // Send a string response to the client return c.SendString("Hello, World 👋!") }) // Start the server on port 3000 log.Fatal(app.Listen(":3000")) } ``` 这个简单的服务器易于设置和运行。它介绍了 Fiber 的核心概念:app 初始化、路由定义和启动服务器。只需运行此 Go 程序,并在浏览器中访问 `http://localhost:3000` 即可查看消息。 ## 零分配 Fiber 针对**高性能**进行了优化,这意味着从 **fiber.Ctx** 返回的值默认**不是**不可变的,并且**将**在请求之间被重用。根据经验,您**必须**仅在 handler 内使用上下文值,并且**不得**保留任何引用。一旦您从 handler 返回,从上下文中获取的任何值都将用于未来的请求中。访问我们的[文档](https://docs.gofiber.io/#zero-allocation)了解更多信息。 ## 🤖 基准测试 这些测试由 [TechEmpower](https://www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=plaintext) 执行。如果您想查看所有结果,请访问我们的 [Wiki](https://docs.gofiber.io/extra/benchmarks)。

## 🎯 特性 - 强大的 [路由](https://docs.gofiber.io/guide/routing) - 提供 [静态文件](https://docs.gofiber.io/api/app#static) - 极致的 [性能](https://docs.gofiber.io/extra/benchmarks) - [低内存](https://docs.gofiber.io/extra/benchmarks) 占用 - [API 端点](https://docs.gofiber.io/api/ctx) - [中间件](https://docs.gofiber.io/category/-middleware) & [Next](https://docs.gofiber.io/api/ctx#next) 支持 - [快速](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497) 的服务器端编程 - [模板引擎](https://github.com/gofiber/template) - [WebSocket 支持](https://github.com/gofiber/contrib/tree/main/websocket) - [Socket.io 支持](https://github.com/gofiber/contrib/tree/main/socketio) - [Server-Sent Events](https://github.com/gofiber/recipes/tree/master/sse) - [Rate Limiter](https://docs.gofiber.io/api/middleware/limiter) - 以及更多,[探索 Fiber](https://docs.gofiber.io/) ## 💡 理念 从 [Node.js](https://nodejs.org/en/about/) 转到 [Go](https://go.dev/doc/) 的新 Gophers 在开始构建其 Web 应用程序或微服务之前,都要经历一段学习曲线。Fiber 作为一个 **Web 框架**,是本着**极简主义**的理念创建的,并遵循 **UNIX 方式**,以便新的 Gophers 能够在热烈和信任的欢迎下快速进入 Go 的世界。 Fiber 的灵感来源于 Internet 上最流行的 Web 框架 Express。我们结合了 Express 的**易用性**和 Go 的**原始性能**。如果您曾经在 Node.js 中实现过 Web 应用程序(*使用 Express 或类似框架*),那么许多方法和原则对您来说会感到**非常熟悉**。 我们在 [issues](https://github.com/gofiber/fiber/issues)、Discord [频道](https://gofiber.io/discord) *以及整个 Internet* 上**倾听**用户的意见,以创建一个**快速**、**灵活**且**友好**的 Go Web 框架,适用于**任何**任务、**截止日期**和开发者**技能**!就像 Express 在 JavaScript 领域所做的那样。 ## ⚠️ 限制 - 由于 Fiber 使用了 unsafe,该库可能并不总是与最新的 Go 版本兼容。Fiber v3 已在 Go 1.25 或更高版本上进行了测试。 - 当您在路由器上注册常见的 `net/http` handler 形状时,Fiber 会自动适配它们,并且当您需要桥接整个应用程序或 `net/http` 中间件时,您仍然可以使用 [adaptor 中间件](https://docs.gofiber.io/next/middleware/adaptor/)。 ### net/http 兼容性 Fiber 可以与标准库并行运行。路由器直接接受现有的 `net/http` handler,甚至可以与原生 `fasthttp.RequestHandler` 回调一起使用,因此您可以插入旧版端点而无需手动包装它们: ``` package main import ( "log" "net/http" "github.com/gofiber/fiber/v3" ) func main() { httpHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if _, err := w.Write([]byte("served by net/http")); err != nil { panic(err) } }) app := fiber.New() app.Get("/", httpHandler) // Start the server on port 3000 log.Fatal(app.Listen(":3000")) } ``` 当您需要转换整个应用程序或重用 `net/http` 中间件链时,请依赖 [adaptor 中间件](https://docs.gofiber.io/next/middleware/adaptor/)。它双向转换 handler 和中间件,甚至允许您将 Fiber app 挂载到 `net/http` 服务器中。 ### Express 风格的 Handler Fiber 还适配了在轻量级 `fiber.Req` 和 `fiber.Res` 辅助接口上操作的 Express 风格回调。这使您可以从受 Express 启发的代码库移植中间件和路由 handler,同时保留 Fiber 的路由功能: ``` // Request/response handlers (2-argument) app.Get("/", func(req fiber.Req, res fiber.Res) error { return res.SendString("Hello from Express-style handlers!") }) // Middleware with an error-returning next callback (3-argument) app.Use(func(req fiber.Req, res fiber.Res, next func() error) error { if req.IP() == "192.168.1.254" { return res.SendStatus(fiber.StatusForbidden) } return next() }) // Middleware with a no-arg next callback (3-argument) app.Use(func(req fiber.Req, res fiber.Res, next func()) { if req.Get("X-Skip") == "true" { return // stop the chain without calling next } next() }) ``` ## 👀 示例 下面列出了一些常见的示例。如果您想查看更多代码示例,请访问我们的 [Recipes 仓库](https://github.com/gofiber/recipes) 或访问我们托管的 [API 文档](https://docs.gofiber.io)。 ### 📖 [**基础路由**](https://docs.gofiber.io/#basic-routing) ``` package main import ( "fmt" "log" "github.com/gofiber/fiber/v3" ) func main() { app := fiber.New() // GET /api/register app.Get("/api/*", func(c fiber.Ctx) error { msg := fmt.Sprintf("✋ %s", c.Params("*")) return c.SendString(msg) // => ✋ register }) // GET /flights/LAX-SFO app.Get("/flights/:from-:to", func(c fiber.Ctx) error { msg := fmt.Sprintf("💸 From: %s, To: %s", c.Params("from"), c.Params("to")) return c.SendString(msg) // => 💸 From: LAX, To: SFO }) // GET /dictionary.txt app.Get("/:file.:ext", func(c fiber.Ctx) error { msg := fmt.Sprintf("📃 %s.%s", c.Params("file"), c.Params("ext")) return c.SendString(msg) // => 📃 dictionary.txt }) // GET /john/75 app.Get("/:name/:age/:gender?", func(c fiber.Ctx) error { msg := fmt.Sprintf("👴 %s is %s years old", c.Params("name"), c.Params("age")) return c.SendString(msg) // => 👴 john is 75 years old }) // GET /john app.Get("/:name", func(c fiber.Ctx) error { msg := fmt.Sprintf("Hello, %s 👋!", c.Params("name")) return c.SendString(msg) // => Hello john 👋! }) log.Fatal(app.Listen(":3000")) } ``` #### 📖 [**路由命名**](https://docs.gofiber.io/api/app#name) ``` package main import ( "encoding/json" "fmt" "log" "github.com/gofiber/fiber/v3" ) func main() { app := fiber.New() app.Get("/api/*", func(c fiber.Ctx) error { msg := fmt.Sprintf("✋ %s", c.Params("*")) return c.SendString(msg) // => ✋ register }).Name("api") route := app.GetRoute("api") data, _ := json.MarshalIndent(route, "", " ") fmt.Println(string(data)) // Prints: // { // "method": "GET", // "name": "api", // "path": "/api/*", // "params": [ // "*1" // ] // } log.Fatal(app.Listen(":3000")) } ``` #### 📖 [**提供静态文件**](https://docs.gofiber.io/api/app#static) ``` package main import ( "log" "github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3/middleware/static" ) func main() { app := fiber.New() // Serve static files from the "./public" directory app.Get("/*", static.New("./public")) // => http://localhost:3000/js/script.js // => http://localhost:3000/css/style.css app.Get("/prefix*", static.New("./public")) // => http://localhost:3000/prefix/js/script.js // => http://localhost:3000/prefix/css/style.css // Serve a single file for any unmatched routes app.Get("*", static.New("./public/index.html")) // => http://localhost:3000/any/path/shows/index.html log.Fatal(app.Listen(":3000")) } ``` #### 📖 [**中间件 & Next**](https://docs.gofiber.io/api/ctx#next) ``` package main import ( "fmt" "log" "github.com/gofiber/fiber/v3" ) func main() { app := fiber.New() // Middleware that matches any route app.Use(func(c fiber.Ctx) error { fmt.Println("🥇 First handler") return c.Next() }) // Middleware that matches all routes starting with /api app.Use("/api", func(c fiber.Ctx) error { fmt.Println("🥈 Second handler") return c.Next() }) // GET /api/list app.Get("/api/list", func(c fiber.Ctx) error { fmt.Println("🥉 Last handler") return c.SendString("Hello, World 👋!") }) log.Fatal(app.Listen(":3000")) } ```
📚 显示更多代码示例 ### 视图引擎 📖 [Config](https://docs.gofiber.io/api/fiber#config) 📖 [Engines](https://github.com/gofiber/template) 📖 [Render](https://docs.gofiber.io/api/ctx#render) 当未设置视图引擎时,Fiber 默认使用 [html/template](https://pkg.go.dev/html/template/)。 如果您想执行 partials 或使用不同的引擎,如 [amber](https://github.com/eknkc/amber)、[handlebars](https://github.com/aymerick/raymond)、[mustache](https://github.com/cbroglie/mustache) 或 [pug](https://github.com/Joker/jade) 等,请查看我们的 [Template](https://github.com/gofiber/template) 包,它支持多种视图引擎。 ``` package main import ( "log" "github.com/gofiber/fiber/v3" "github.com/gofiber/template/pug" ) func main() { // Initialize a new Fiber app with Pug template engine app := fiber.New(fiber.Config{ Views: pug.New("./views", ".pug"), }) // Define a route that renders the "home.pug" template app.Get("/", func(c fiber.Ctx) error { return c.Render("home", fiber.Map{ "title": "Homepage", "year": 1999, }) }) log.Fatal(app.Listen(":3000")) } ``` ### 将路由分组成链 📖 [Group](https://docs.gofiber.io/api/app#group) ``` package main import ( "log" "github.com/gofiber/fiber/v3" ) func middleware(c fiber.Ctx) error { log.Println("Middleware executed") return c.Next() } func handler(c fiber.Ctx) error { return c.SendString("Handler response") } func main() { app := fiber.New() // Root API group with middleware api := app.Group("/api", middleware) // /api // API v1 routes v1 := api.Group("/v1", middleware) // /api/v1 v1.Get("/list", handler) // /api/v1/list v1.Get("/user", handler) // /api/v1/user // API v2 routes v2 := api.Group("/v2", middleware) // /api/v2 v2.Get("/list", handler) // /api/v2/list v2.Get("/user", handler) // /api/v2/user log.Fatal(app.Listen(":3000")) } ``` ### 中间件 Logger 📖 [Logger](https://docs.gofiber.io/api/middleware/logger) ``` package main import ( "log" "github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3/middleware/logger" ) func main() { app := fiber.New() // Use Logger middleware app.Use(logger.New()) // Define routes app.Get("/", func(c fiber.Ctx) error { return c.SendString("Hello, Logger!") }) log.Fatal(app.Listen(":3000")) } ``` ### 跨域资源共享 (CORS) 📖 [CORS](https://docs.gofiber.io/api/middleware/cors) ``` package main import ( "log" "github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3/middleware/cors" ) func main() { app := fiber.New() // Use CORS middleware with default settings app.Use(cors.New()) // Define routes app.Get("/", func(c fiber.Ctx) error { return c.SendString("CORS enabled!") }) log.Fatal(app.Listen(":3000")) } ``` 通过在 `Origin` 头中传递任何域来检查 CORS: ``` curl -H "Origin: http://example.com" --verbose http://localhost:3000 ``` ### 自定义 404 响应 📖 [HTTP Methods](https://docs.gofiber.io/api/ctx#status) ``` package main import ( "log" "github.com/gofiber/fiber/v3" ) func main() { app := fiber.New() // Define routes app.Get("/", static.New("./public")) app.Get("/demo", func(c fiber.Ctx) error { return c.SendString("This is a demo page!") }) app.Post("/register", func(c fiber.Ctx) error { return c.SendString("Registration successful!") }) // Middleware to handle 404 Not Found app.Use(func(c fiber.Ctx) error { return c.SendStatus(fiber.StatusNotFound) // => 404 "Not Found" }) log.Fatal(app.Listen(":3000")) } ``` ### JSON 响应 📖 [JSON](https://docs.gofiber.io/api/ctx#json) ``` package main import ( "log" "github.com/gofiber/fiber/v3" ) type User struct { Name string `json:"name"` Age int `json:"age"` } func main() { app := fiber.New() // Route that returns a JSON object app.Get("/user", func(c fiber.Ctx) error { return c.JSON(&User{"John", 20}) // => {"name":"John", "age":20} }) // Route that returns a JSON map app.Get("/json", func(c fiber.Ctx) error { return c.JSON(fiber.Map{ "success": true, "message": "Hi John!", }) // => {"success":true, "message":"Hi John!"} }) log.Fatal(app.Listen(":3000")) } ``` ### WebSocket 升级 📖 [Websocket](https://github.com/gofiber/websocket) ``` package main import ( "log" "github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3/middleware/websocket" ) func main() { app := fiber.New() // WebSocket route app.Get("/ws", websocket.New(func(c *websocket.Conn) { defer c.Close() for { // Read message from client mt, msg, err := c.ReadMessage() if err != nil { log.Println("read:", err) break } log.Printf("recv: %s", msg) // Write message back to client err = c.WriteMessage(mt, msg) if err != nil { log.Println("write:", err) break } } })) log.Fatal(app.Listen(":3000")) // Connect via WebSocket at ws://localhost:3000/ws } ``` ### Server-Sent Events 📖 [More Info](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events) ``` package main import ( "bufio" "fmt" "log" "time" "github.com/gofiber/fiber/v3" "github.com/valyala/fasthttp" ) func main() { app := fiber.New() // Server-Sent Events route app.Get("/sse", func(c fiber.Ctx) error { c.Set("Content-Type", "text/event-stream") c.Set("Cache-Control", "no-cache") c.Set("Connection", "keep-alive") c.Set("Transfer-Encoding", "chunked") c.Context().SetBodyStreamWriter(func(w *bufio.Writer) { var i int for { i++ msg := fmt.Sprintf("%d - the time is %v", i, time.Now()) fmt.Fprintf(w, "data: Message: %s\n\n", msg) fmt.Println(msg) w.Flush() time.Sleep(5 * time.Second) } }) return nil }) log.Fatal(app.Listen(":3000")) } ``` ### Recover 中间件 📖 [Recover](https://docs.gofiber.io/api/middleware/recover) ``` package main import ( "log" "github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3/middleware/recover" ) func main() { app := fiber.New() // Use Recover middleware to handle panics gracefully app.Use(recover.New()) // Route that intentionally panics app.Get("/", func(c fiber.Ctx) error { panic("normally this would crash your app") }) log.Fatal(app.Listen(":3000")) } ``` ### 使用可信代理 📖 [Config](https://docs.gofiber.io/api/fiber#config) ``` package main import ( "log" "github.com/gofiber/fiber/v3" ) func main() { app := fiber.New(fiber.Config{ // Configure trusted proxies - WARNING: Only trust proxies you control // Using TrustProxy: true with unrestricted IPs can lead to IP spoofing TrustProxy: true, TrustProxyConfig: fiber.TrustProxyConfig{ Proxies: []string{"10.0.0.0/8", "172.16.0.0/12"}, // Example: Internal network ranges only }, ProxyHeader: fiber.HeaderXForwardedFor, }) // Define routes app.Get("/", func(c fiber.Ctx) error { return c.SendString("Trusted Proxy Configured!") }) log.Fatal(app.Listen(":3000")) } ```
## 🧬 内置中间件 以下是 Fiber 框架中包含的中间件列表。 | Middleware | Description | |--------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | [adaptor](https://github.com/gofiber/fiber/tree/main/middleware/adaptor) | 用于将 net/http handler 转换为 Fiber request handler 或反向转换的适配器。 | | [basicauth](https://github.com/gofiber/fiber/tree/main/middleware/basicauth) | 提供 HTTP 基本认证。对于有效的凭据,它调用下一个 handler;对于缺失或无效的凭据,返回 401 Unauthorized。 | | [cache](https://github.com/gofiber/fiber/tree/main/middleware/cache) | 拦截并缓存 HTTP 响应。 | | [compress](https://github.com/gofiber/fiber/tree/main/middleware/compress) | Fiber 的压缩中间件,支持 `deflate`、`gzip`、`brotli` 和 `zstd`。 | | [cors](https://github.com/gofiber/fiber/tree/main/middleware/cors) | 通过各种选项启用跨域资源共享 (CORS)。 | | [csrf](https://github.com/gofiber/fiber/tree/main/middleware/csrf) | 防止 CSRF 攻击。 | | [earlydata](https://github.com/gofiber/fiber/tree/main/middleware/earlydata) | 添加对 TLS 1.3 早期数据("0-RTT")功能的支持。 | | [encryptcookie](https://github.com/gofiber/fiber/tree/main/middleware/encryptcookie) | 加密 cookie 值的加密中间件。 | | [envvar](https://github.com/gofiber/fiber/tree/main/middleware/envvar) | 通过提供可选配置来暴露环境变量。 | | [etag](https://github.com/gofiber/fiber/tree/main/middleware/etag) | 允许缓存更高效并节省带宽,因为如果内容未更改,Web 服务器无需重新发送完整响应。 | | [expvar](https://github.com/gofiber/fiber/tree/main/middleware/expvar) | 通过其 HTTP 服务器以 JSON 格式提供运行时暴露的变量。 | | [favicon](https://github.com/gofiber/fiber/tree/main/middleware/favicon) | 忽略日志中的 favicon,或者如果提供了文件路径则从内存中提供。 | | [healthcheck](https://github.com/gofiber/fiber/tree/main/middleware/healthcheck) | Fiber 的存活和就绪探针。 | | [helmet](https://github.com/gofiber/fiber/tree/main/middleware/helmet) | 通过设置各种 HTTP 头来帮助保护您的应用程序。 | | [idempotency](https://github.com/gofiber/fiber/tree/main/middleware/idempotency) | 允许构建容错 API,确保重复的请求不会错误地导致在服务器端多次执行相同的操作。 | | [keyauth](https://github.com/gofiber/fiber/tree/main/middleware/keyauth) | 添加对基于密钥的认证的支持。 | | [limiter](https://github.com/gofiber/fiber/tree/main/middleware/limiter) | 向 Fiber 添加 Rate-limiting 支持。用于限制对公共 API 和/或端点(如密码重置)的重复请求。 | | [logger](https://github.com/gofiber/fiber/tree/main/middleware/logger) | HTTP 请求/响应日志记录器。 | | [pprof](https://github.com/gofiber/fiber/tree/main/middleware/pprof) | 以 pprof 格式提供运行时分析数据。 | | [proxy](https://github.com/gofiber/fiber/tree/main/middleware/proxy) | 允许您将请求代理到多个服务器。 | | [recover](https://github.com/gofiber/fiber/tree/main/middleware/recover) | 从堆栈链中的任何 panic 中恢复,并将控制权交给集中的 ErrorHandler。 | | [redirect](https://github.com/gofiber/fiber/tree/main/middleware/redirect) | 重定向中间件。 | | [requestid](https://github.com/gofiber/fiber/tree/main/middleware/requestid) | 向每个请求添加一个请求 ID。 | | [responsetime](https://github.com/gofiber/fiber/tree/main/middleware/responsetime) | 测量请求处理持续时间并将其写入可配置的响应头。 | | [rewrite](https://github.com/gofiber/fiber/tree/main/middleware/rewrite) | 根据提供的规则重写 URL 路径。这对于向后兼容性或仅创建更清晰、更具描述性的链接很有帮助。 | | [session](https://github.com/gofiber/fiber/tree/main/middleware/session) | Session 中间件。注意:此中间件使用我们的 Storage 包。 | | [skip](https://github.com/gofiber/fiber/tree/main/middleware/skip) | Skip 中间件,如果谓词为真,则跳过被包装的 handler。 | | [static](https://github.com/gofiber/fiber/tree/main/middleware/static) | Fiber 的静态中间件,用于提供静态文件,如 **images**、**CSS** 和 **JavaScript**。 | | [timeout](https://github.com/gofiber/fiber/tree/main/middleware/timeout) | 为请求添加最长时间,如果超过该时间则转发给 ErrorHandler。 | ## 🧬 外部中间件 由 [Fiber 团队](https://github.com/orgs/gofiber/people) 维护的外部托管中间件模块列表。 | Middleware | Description | | :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------- | | [contrib](https://github.com/gofiber/contrib) | 第三方中间件 | | [storage](https://github.com/gofiber/storage) | 实现了 Storage 接口的预制存储驱动程序,旨在与各种 Fiber 中间件一起使用。 | | [template](https://github.com/gofiber/template) | 此包包含 9 个可与 Fiber 一起使用的模板引擎。 | ## 🕶️ 精选列表 有关更多文章、中间件、示例或工具,请查看我们的 [awesome list](https://github.com/gofiber/awesome-fiber)。 ## 💻 开发 为了确保您的贡献准备好提交 Pull Request,请使用以下 `Makefile` 命令。这些工具有助于保持代码质量和一致性。 - **make help**: 显示可用命令。 - **make audit**: 进行质量检查。 - **make benchmark**: 对代码性能进行基准测试。 - **make coverage**: 生成测试覆盖率报告。 - **make format**: 自动格式化代码。 - **make lint**: 运行 lint 检查。 - **make test**: 执行所有测试。 -make tidy**: 整理依赖项。 运行这些命令以确保您的代码符合项目标准和最佳实践。 ## ⭐️ Stargazers ## 🧾 许可证 版权所有 (c) 2019-present [Fenny](https://github.com/fenny) 和 [贡献者](https://github.com/gofiber/fiber/graphs/contributors)。`Fiber` 是根据 [MIT 许可证](https://github.com/gofiber/fiber/blob/main/LICENSE) 授权的自由开源软件。官方 Logo 由 [Vic Shóstak](https://github.com/koddr) 创作,并根据 [Creative Commons](https://creativecommons.org/licenses/by-sa/4.0/) 许可证 (CC BY-SA 4.0 International) 分发。
标签:API开发, DNS解析, EVTX分析, Express风格, Fasthttp, Fiber, Golang, Go语言, HTTP服务器, REST API, Syscall, Web开发, Web框架, 中间件, 后端开发, 安全编程, 开源项目, 日志审计, 程序破解, 零内存分配