{"id":16838270,"url":"https://github.com/abemedia/go-don","last_synced_at":"2026-03-04T03:32:11.127Z","repository":{"id":38318404,"uuid":"464650471","full_name":"abemedia/go-don","owner":"abemedia","description":"API framework written in Golang.","archived":false,"fork":false,"pushed_at":"2026-01-24T13:47:03.000Z","size":1515,"stargazers_count":57,"open_issues_count":14,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-01-25T01:42:55.052Z","etag":null,"topics":["go","golang","http"],"latest_commit_sha":null,"homepage":"https://pkg.go.dev/github.com/abemedia/go-don","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/abemedia.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-02-28T21:29:55.000Z","updated_at":"2026-01-24T13:47:06.000Z","dependencies_parsed_at":"2023-09-30T01:28:36.619Z","dependency_job_id":"e382906a-6d7b-476f-af92-565c03422f19","html_url":"https://github.com/abemedia/go-don","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/abemedia/go-don","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abemedia%2Fgo-don","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abemedia%2Fgo-don/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abemedia%2Fgo-don/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abemedia%2Fgo-don/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abemedia","download_url":"https://codeload.github.com/abemedia/go-don/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abemedia%2Fgo-don/sbom","scorecard":{"id":160507,"data":{"date":"2025-08-11","repo":{"name":"github.com/abemedia/go-don","commit":"b4ecf7d0ce1eb248590b341fdc90985e7f6b26a9"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/8 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":1,"reason":"2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: topLevel 'contents' permission set to 'read': .github/workflows/benchmark.yml:7","Info: topLevel 'contents' permission set to 'read': .github/workflows/ci.yml:10","Info: topLevel 'actions' permission set to 'read': .github/workflows/codeql.yml:12","Info: topLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:13","Warn: topLevel 'security-events' permission set to 'write': .github/workflows/codeql.yml:14","Warn: topLevel 'contents' permission set to 'write': .github/workflows/dependabot.yml:8","Info: topLevel 'pull-requests' permission set to 'read': .github/workflows/pr-title.yml:12","Warn: topLevel 'contents' permission set to 'write': .github/workflows/release.yml:8","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/benchmark.yml:80: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/benchmark.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/benchmark.yml:86: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/benchmark.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/benchmark.yml:104: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/benchmark.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/benchmark.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/benchmark.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/benchmark.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/benchmark.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/benchmark.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/benchmark.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/benchmark.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/benchmark.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/codeql.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dependabot.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/dependabot.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pr-title.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/pr-title.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/abemedia/go-don/release.yml/master?enable=pin","Warn: goCommand not pinned by hash: .github/workflows/benchmark.yml:61","Info:   0 out of  10 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   9 third-party GitHubAction dependencies pinned","Info:   0 out of   1 goCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":8,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 20 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-16T13:16:34.530Z","repository_id":38318404,"created_at":"2025-08-16T13:16:34.530Z","updated_at":"2025-08-16T13:16:34.530Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30070762,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T03:25:38.285Z","status":"ssl_error","status_checked_at":"2026-03-04T03:25:05.086Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","golang","http"],"created_at":"2024-10-13T12:22:09.631Z","updated_at":"2026-03-04T03:32:11.078Z","avatar_url":"https://github.com/abemedia.png","language":"Go","funding_links":[],"categories":["Web Frameworks","Web框架"],"sub_categories":["Utility/Miscellaneous","实用程序/Miscellaneous"],"readme":"# Don - Go API Framework\n\n\u003cimg align=\"right\" width=\"150\" alt=\"\" src=\"assets/logo.png\"\u003e\n\n[![GoDoc](https://pkg.go.dev/badge/github.com/abemedia/go-don)](https://pkg.go.dev/github.com/abemedia/go-don)\n[![Codecov](https://codecov.io/gh/abemedia/go-don/branch/master/graph/badge.svg)](https://codecov.io/gh/abemedia/go-don)\n[![Go Report Card](https://goreportcard.com/badge/github.com/abemedia/go-don)](https://goreportcard.com/report/github.com/abemedia/go-don)\n\nDon is a fast \u0026 simple API framework written in Go. It features a super-simple API and thanks to\n[fasthttp](https://github.com/valyala/fasthttp) and a custom version of\n[httprouter](https://github.com/abemedia/httprouter) it's blazing fast and has a low memory\nfootprint.\n\nWhile Don is still on v0, minor version updates should be considered breaking changes.\n\n## Contents\n\n- [Overview](#don---go-api-framework)\n  - [Basic Example](#basic-example)\n  - [Configuration](#configuration)\n  - [Support multiple formats](#support-multiple-formats)\n    - [Currently supported formats](#currently-supported-formats)\n    - [Adding custom encoding](#adding-custom-encoding)\n  - [Request parsing](#request-parsing)\n  - [Headers \u0026 response codes](#headers--response-codes)\n  - [Sub-routers](#sub-routers)\n  - [Middleware](#middleware)\n  - [Benchmarks](#benchmarks)\n\n## Basic Example\n\n```go\npackage main\n\nimport (\n  \"context\"\n  \"errors\"\n  \"fmt\"\n  \"net/http\"\n\n  \"github.com/abemedia/go-don\"\n  _ \"github.com/abemedia/go-don/encoding/json\" // Enable JSON parsing \u0026 rendering.\n  _ \"github.com/abemedia/go-don/encoding/yaml\" // Enable YAML parsing \u0026 rendering.\n)\n\ntype GreetRequest struct {\n  Name string `path:\"name\"`         // Get name from the URL path.\n  Age  int    `header:\"X-User-Age\"` // Get age from HTTP header.\n}\n\ntype GreetResponse struct {\n  // Remember to add all the tags for the renderers you enable.\n  Greeting string `json:\"data\" yaml:\"data\"`\n}\n\nfunc Greet(ctx context.Context, req GreetRequest) (*GreetResponse, error) {\n  if req.Name == \"\" {\n    return nil, don.Error(errors.New(\"missing name\"), http.StatusBadRequest)\n  }\n\n  res := \u0026GreetResponse{\n    Greeting: fmt.Sprintf(\"Hello %s, you're %d years old.\", req.Name, req.Age),\n  }\n\n  return res, nil\n}\n\nfunc Pong(context.Context, any) (string, error) {\n  return \"pong\", nil\n}\n\nfunc main() {\n  r := don.New(nil)\n  r.Get(\"/ping\", don.H(Pong)) // Handlers are wrapped with `don.H`.\n  r.Post(\"/greet/:name\", don.H(Greet))\n  r.ListenAndServe(\":8080\")\n}\n```\n\n## Configuration\n\nDon is configured by passing in the `Config` struct to `don.New`.\n\n```go\nr := don.New(\u0026don.Config{\n  DefaultEncoding: \"application/json\",\n  DisableNoContent: false,\n})\n```\n\n### DefaultEncoding\n\nSet this to the format you'd like to use if no `Content-Type` or `Accept` headers are in the\nrequest.\n\n### DisableNoContent\n\nIf you return `nil` from your handler, Don will respond with an empty body and a `204 No Content`\nstatus code. Set this to `true` to disable that behaviour.\n\n## Support multiple formats\n\nSupport multiple request \u0026 response formats without writing extra parsing or rendering code. The API\nuses the `Content-Type` and `Accept` headers to determine what input and output encoding to use.\n\nYou can mix multiple formats, for example if the `Content-Type` header is set to `application/json`,\nhowever the `Accept` header is set to `application/x-yaml`, then the request will be parsed as JSON,\nand the response will be YAML encoded.\n\nIf no `Content-Type` or `Accept` header is passed the default will be used.\n\nFormats need to be explicitly imported e.g.\n\n```go\nimport _ \"github.com/abemedia/go-don/encoding/yaml\"\n```\n\n### Currently supported formats\n\n#### JSON\n\nMIME: `application/json`\n\nParses JSON requests \u0026 encodes responses as JSON. Use the `json` tag in your request \u0026 response\nstructs.\n\n#### XML\n\nMIME: `application/xml`, `text/xml`\n\nParses XML requests \u0026 encodes responses as XML. Use the `xml` tag in your request \u0026 response\nstructs.\n\n#### YAML\n\nMIME: `application/yaml`, `text/yaml`, `application/x-yaml`, `text/x-yaml`, `text/vnd.yaml`\n\nParses YAML requests \u0026 encodes responses as YAML. Use the `yaml` tag in your request \u0026 response\nstructs.\n\n#### Form (input only)\n\nMIME: `application/x-www-form-urlencoded`, `multipart/form-data`\n\nParses form data requests. Use the `form` tag in your request struct.\n\n#### Text\n\nMIME: `text/plain`\n\nParses non-struct requests and encodes non-struct responses e.g. `string`, `int`, `bool` etc.\n\n```go\nfunc MyHandler(ctx context.Context, req int64) (string, error) {\n  // ...\n}\n```\n\nIf the request is a struct and the `Content-Type` header is set to `text/plain` it returns a\n`415 Unsupported Media Type` error.\n\n#### MessagePack\n\nMIME: `application/msgpack`, `application/x-msgpack`, `application/vnd.msgpack`\n\nParses MessagePack requests \u0026 encodes responses as MessagePack. Use the `msgpack` tag in your\nrequest \u0026 response structs.\n\n#### TOML\n\nMIME: `application/toml`\n\nParses TOML requests \u0026 encodes responses as TOML. Use the `toml` tag in your request \u0026 response\nstructs.\n\n#### Protocol Buffers\n\nMIME: `application/protobuf`, `application/x-protobuf`\n\nParses protobuf requests \u0026 encodes responses as protobuf. Use pointer types generated with `protoc`\nas your request \u0026 response structs.\n\n### Adding custom encoding\n\nAdding your own is easy. See [encoding/json/json.go](./encoding/json/json.go).\n\n## Request parsing\n\nAutomatically unmarshals values from headers, URL query, URL path \u0026 request body into your request\nstruct.\n\n```go\ntype MyRequest struct {\n  // Get from the URL path.\n  ID int64 `path:\"id\"`\n\n  // Get from the URL query.\n  Filter string `query:\"filter\"`\n\n  // Get from the JSON, YAML, XML or form body.\n  Content float64 `form:\"bar\" json:\"bar\" yaml:\"bar\" xml:\"bar\"`\n\n  // Get from the HTTP header.\n  Lang string `header:\"Accept-Language\"`\n}\n```\n\nPlease note that using a pointer as the request type negatively affects performance.\n\n## Headers \u0026 response codes\n\nImplement the `StatusCoder` and `Headerer` interfaces to customise headers and response codes.\n\n```go\ntype MyResponse struct {\n  Foo  string `json:\"foo\"`\n}\n\n// Set a custom HTTP response code.\nfunc (nr *MyResponse) StatusCode() int {\n  return 201\n}\n\n// Add custom headers to the response.\nfunc (nr *MyResponse) Header() http.Header {\n  header := http.Header{}\n  header.Set(\"foo\", \"bar\")\n  return header\n}\n```\n\n## Sub-routers\n\nYou can create sub-routers using the `Group` function:\n\n```go\nr := don.New(nil)\nsub := r.Group(\"/api\")\nsub.Get(\"/hello\", don.H(Hello))\n```\n\n## Middleware\n\nDon uses the standard fasthttp middleware format of\n`func(fasthttp.RequestHandler) fasthttp.RequestHandler`.\n\nFor example:\n\n```go\nfunc loggingMiddleware(next fasthttp.RequestHandler) fasthttp.RequestHandler {\n  return func(ctx *fasthttp.RequestCtx) {\n    log.Println(string(ctx.RequestURI()))\n    next(ctx)\n  }\n}\n```\n\nIt is registered on a router using `Use` e.g.\n\n```go\nr := don.New(nil)\nr.Post(\"/\", don.H(handler))\nr.Use(loggingMiddleware)\n```\n\nMiddleware registered on a group only applies to routes in that group and child groups.\n\n```go\nr := don.New(nil)\nr.Get(\"/login\", don.H(loginHandler))\nr.Use(loggingMiddleware) // applied to all routes\n\napi := r.Group(\"/api\")\napi.Get(\"/hello\", don.H(helloHandler))\napi.Use(authMiddleware) // applied to routes `/api/hello` and `/api/v2/bye`\n\n\nv2 := api.Group(\"/v2\")\nv2.Get(\"/bye\", don.H(byeHandler))\nv2.Use(corsMiddleware) // only applied to `/api/v2/bye`\n\n```\n\nTo pass values from the middleware to the handler extend the context e.g.\n\n```go\nfunc myMiddleware(next fasthttp.RequestHandler) fasthttp.RequestHandler {\n  return func(ctx *fasthttp.RequestCtx) {\n    ctx.SetUserValue(ContextUserKey, \"my_user\")\n    next(ctx)\n  }\n}\n```\n\nThis can now be accessed in the handler:\n\n```go\nuser := ctx.Value(ContextUserKey).(string)\n```\n\n## Benchmarks\n\nTo give you a rough idea of Don's performance, here is a comparison with Gin.\n\n### Request Parsing\n\nDon has extremely fast \u0026 efficient binding of request data.\n\n| Benchmark name           |     (1) |         (2) |       (3) |          (4) |\n| ------------------------ | ------: | ----------: | --------: | -----------: |\n| BenchmarkDon_BindRequest | 2947474 | 390.3 ns/op |   72 B/op |  2 allocs/op |\n| BenchmarkGin_BindRequest |  265609 |  4377 ns/op | 1193 B/op | 21 allocs/op |\n\nSource: [benchmarks/binding_test.go](./benchmarks/binding_test.go)\n\n### Serving HTTP Requests\n\nKeep in mind that the majority of time here is actually the HTTP roundtrip.\n\n| Benchmark name    |   (1) |         (2) |       (3) |          (4) |\n| ----------------- | ----: | ----------: | --------: | -----------: |\n| BenchmarkDon_HTTP | 45500 | 25384 ns/op |   32 B/op |  3 allocs/op |\n| BenchmarkGin_HTTP | 22995 | 49865 ns/op | 2313 B/op | 21 allocs/op |\n\nSource: [benchmarks/http_test.go](./benchmarks/http_test.go)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabemedia%2Fgo-don","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabemedia%2Fgo-don","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabemedia%2Fgo-don/lists"}