{"id":18904457,"url":"https://github.com/oopsguy/tiny","last_synced_at":"2026-03-04T13:30:19.277Z","repository":{"id":112754621,"uuid":"190421440","full_name":"oopsguy/tiny","owner":"oopsguy","description":"A tiny Go web library for learning.","archived":false,"fork":false,"pushed_at":"2019-06-05T16:32:39.000Z","size":6,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-12-31T10:30:05.812Z","etag":null,"topics":["framework","go","golang","learning","library","web"],"latest_commit_sha":null,"homepage":"","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/oopsguy.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2019-06-05T15:33:14.000Z","updated_at":"2019-06-05T16:34:00.000Z","dependencies_parsed_at":null,"dependency_job_id":"32265d9f-6baf-4e5e-9101-a4e8ff0a74b8","html_url":"https://github.com/oopsguy/tiny","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oopsguy%2Ftiny","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oopsguy%2Ftiny/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oopsguy%2Ftiny/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oopsguy%2Ftiny/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oopsguy","download_url":"https://codeload.github.com/oopsguy/tiny/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239889026,"owners_count":19713702,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["framework","go","golang","learning","library","web"],"created_at":"2024-11-08T09:08:35.612Z","updated_at":"2026-03-04T13:30:19.235Z","avatar_url":"https://github.com/oopsguy.png","language":"Go","readme":"# Tiny\n\n个人学习 Go 而封装的简单 Web 开发库，其大部分依赖 Go 原生 http 包中的 API。\n\nTiny - a tiny Go web library for learning. \n\n## 安装（Install）\n\n```bash\ngo get -u github.com/oopsguy/tiny\n```\n\n## 用法（Usage）\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\n\t\"github.com/oopsguy/tiny\"\n)\n\nfunc main() {\n\tserver := tiny.Default()\n\tserver.SupportTemplate(\"web/template/**\", nil)\n\tserver.Static(\"/static/\", \"web/static/\")\n\n\trouter := server.Router()\n\t// global-level middleware\n\trouter.Use(func(next tiny.Handler) tiny.Handler {\n\t\treturn func(ctx tiny.Ctx) error {\n\t\t\tfmt.Println(\"Global Middleware\")\n\t\t\treturn next(ctx)\n\t\t}\n\t})\n\n\trouter.GET(\"\", func(c tiny.Ctx) error {\n\t\treturn c.Template(\"index.html\", nil)\n\t}, func(next tiny.Handler) tiny.Handler {\n\t\treturn func(ctx tiny.Ctx) error {\n\t\t\tfmt.Println(\"Index Middleware\")\n\t\t\treturn next(ctx)\n\t\t}\n\t})\n\n\t// API module\n\tapiRouter := router.Module(\"/api\")\n\t{\n\t\tapiV1Router := apiRouter.Module(\"/v1\")\n\t\tapiV1Router.GET(\"/users\", func(ctx tiny.Ctx) error {\n\t\t\treturn ctx.Content(\"users\")\n\t\t})\n\n\t\tapiV2Router := apiRouter.Module(\"/v2\")\n\t\tapiV2Router.GET(\"/users\", func(ctx tiny.Ctx) error {\n\t\t\treturn ctx.Content(\"users\")\n\t\t})\n\t}\n\n\t// admin module\n\tadminRouter := router.Module(\"/admin\")\n\t{\n\t\tadminRouter.Use(func(next tiny.Handler) tiny.Handler {\n\t\t\treturn func(ctx tiny.Ctx) error {\n\t\t\t\tfmt.Println(\"Admin Middleware\")\n\t\t\t\treturn next(ctx)\n\t\t\t}\n\t\t})\n\n\t\tadminRouter.GET(\"/user\", func(ctx tiny.Ctx) error {\n\t\t\treturn ctx.HTML(\"\u003ch1\u003eUser\u003c/h1\u003e\")\n\t\t}, func(next tiny.Handler) tiny.Handler {\n\t\t\treturn func(ctx tiny.Ctx) error {\n\t\t\t\tfmt.Println(\"User Middleware\")\n\t\t\t\treturn next(ctx)\n\t\t\t}\n\t\t})\n\n\t\tadminRouter.GET(\"/posts\", func(ctx tiny.Ctx) error {\n\t\t\treturn ctx.Content(\"Post\")\n\t\t})\n\t}\n\n\tif err := server.Run(\":8484\"); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n```\n\n## 简介（Intro）\n\n### 路由（Router）\n\n```go\ntype Router interface {\n    Handlers() []HandlerInfo\n    Module(prefix string) Router\n    Use(middleware ...MiddlewareHandler) Router\n    Add(pattern, method string, handler Handler, middleware ...MiddlewareHandler) Router\n    ANY(pattern string, handler Handler, middleware ...MiddlewareHandler) Router\n    GET(pattern string, handler Handler, middleware ...MiddlewareHandler) Router\n    POST(pattern string, handler Handler, middleware ...MiddlewareHandler) Router\n    DELETE(pattern string, handler Handler, middleware ...MiddlewareHandler) Router\n    PUT(pattern string, handler Handler, middleware ...MiddlewareHandler) Router\n    PATCH(pattern string, handler Handler, middleware ...MiddlewareHandler) Router\n    OPTIONS(pattern string, handler Handler, middleware ...MiddlewareHandler) Router\n    HEAD(pattern string, handler Handler, middleware ...MiddlewareHandler) Router\n}\n```\n\n### 模板渲染（Template Renderer）\n\n默认使用 Go 的 `html.Template` 模板，你可以自己实现 `TemplateResolver` 来适配第三方模板引擎。\n\nGo `html.Template` by default. You can register your own `TemplateResolver` to adapt third-party template engine.\n\n```\nfunc (t *Tiny) RegisterTemplateResolver(resolver TemplateResolver)\n```   \n\n模板渲染器接口定义与默认实现：\n\nInterface and default implementation：\n\n```go\ntype TemplateResolver interface {\n\tRender(name string, data interface{}) ([]byte, error)\n}\n\ntype DefaultTplResolver struct {\n\tTemplateResolver\n\tTpl *template.Template\n}\n```\n\n## License\n\n[MIT License](./LICENSE)","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foopsguy%2Ftiny","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foopsguy%2Ftiny","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foopsguy%2Ftiny/lists"}