{"id":14987631,"url":"https://github.com/skyhee/gin-doc-cn","last_synced_at":"2025-05-15T18:09:48.326Z","repository":{"id":41190311,"uuid":"79321630","full_name":"skyhee/gin-doc-cn","owner":"skyhee","description":"go 语言框架 gin 的中文文档","archived":false,"fork":false,"pushed_at":"2020-11-15T07:36:22.000Z","size":9,"stargazers_count":2166,"open_issues_count":5,"forks_count":330,"subscribers_count":61,"default_branch":"master","last_synced_at":"2025-04-07T23:09:04.217Z","etag":null,"topics":["gin","golang"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/skyhee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-01-18T08:57:22.000Z","updated_at":"2025-04-03T03:21:28.000Z","dependencies_parsed_at":"2022-07-14T10:22:07.540Z","dependency_job_id":null,"html_url":"https://github.com/skyhee/gin-doc-cn","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/skyhee%2Fgin-doc-cn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skyhee%2Fgin-doc-cn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skyhee%2Fgin-doc-cn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skyhee%2Fgin-doc-cn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/skyhee","download_url":"https://codeload.github.com/skyhee/gin-doc-cn/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254394722,"owners_count":22063984,"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":["gin","golang"],"created_at":"2024-09-24T14:15:04.009Z","updated_at":"2025-05-15T18:09:48.309Z","avatar_url":"https://github.com/skyhee.png","language":null,"funding_links":[],"categories":["miscellaneous","Others"],"sub_categories":[],"readme":"- [安装与配置](#install)\n- [框架架构](#arch)\n\t- [生命周期](#life-circle)\n\t- [Context](#context)\n- [路由](#router)\n\t- [基本路由](#basic-router)\n\t- [路由参数](#router-param)\n\t- [路由群组](#router-group)\n- [控制器](#controller)\n- [请求](#request)\n\t- [请求头](#request-header)\n\t- [Cookies](#request-cookie)\n\t- [上传文件](#upload)\n- [响应](#response)\n\t- [响应头](#response-header)\n\t- [附加Cookie](#response-cookie)\n\t- [字符串响应](#response-string)\n\t- [JSON响应](#response-json)\n\t- [视图响应](#response-view)\n\t- [文件下载](#response-file)\n\t- [重定向](#response-redirect)\n\t- [同步异步](#sync-async)\n- [视图](#view)\n\t- [传参](#view-param)\n\t- [视图组件](#view-unit)\n- [中间件](#middleware)\n\t- [分类使用](#middleware-use)\n\t- [创建中间件](#middleware-create)\n\t- [中间件参数](#middleware-param)\n- [数据库](#db)\n\t- [Mongodb](#db-mongodb)\n\t- [Mysql](#db-mysql)\n\t- [ORM](#orm)\n- [扩展包](#extensions)\n- [常用方法](#functions)\n\t- [gin]()\n\t- [Context]()\n\n\u003ca name=\"install\"\u003e\u003c/a\u003e\n### 安装与配置\n安装：\n\n```sh\n$ go get gopkg.in/gin-gonic/gin.v1\n```\n`\n注意：确保 GOPATH GOROOT 已经配置\n`\n\n导入：\n```go\nimport \"gopkg.in/gin-gonic/gin.v1\"\n```\n\n\n\u003ca name=\"arch\"\u003e\u003c/a\u003e\n\n### 框架架构\n\u003ca name=\"http\"\u003e\u003c/a\u003e\n\n- HTTP 服务器\n\n**1.默认服务器**\n\n```\nrouter.Run()\n```\n\n**2.HTTP 服务器**\n\n除了默认服务器中 `router.Run()` 的方式外，还可以用 `http.ListenAndServe()`，比如\n\n```go\nfunc main() {\n\trouter := gin.Default()\n\thttp.ListenAndServe(\":8080\", router)\n}\n```\n或者自定义 HTTP 服务器的配置：\n\n```go\nfunc main() {\n\trouter := gin.Default()\n\n\ts := \u0026http.Server{\n\t\tAddr:           \":8080\",\n\t\tHandler:        router,\n\t\tReadTimeout:    10 * time.Second,\n\t\tWriteTimeout:   10 * time.Second,\n\t\tMaxHeaderBytes: 1 \u003c\u003c 20,\n\t}\n\ts.ListenAndServe()\n}\n```\n\n**3.HTTP 服务器替换方案**\n想无缝重启、停机吗? 以下有几种方式：\n\n我们可以使用 [fvbock/endless](https://github.com/fvbock/endless) 来替换默认的 `ListenAndServe`。但是 windows 不能使用。\n\n```go\nrouter := gin.Default()\nrouter.GET(\"/\", handler)\n// [...]\nendless.ListenAndServe(\":4242\", router)\n```\n\n除了 endless 还可以用manners:\n\n[manners](https://github.com/braintree/manners) 兼容windows\n\n```\nmanners.ListenAndServe(\":8888\", r)\n```\n\n如果你使用的 golang 版本大于 1.8 版本, 那么可以用 http.Server 内置的 Shutdown 方法来实现优雅的关闭服务, 一个简单的示例代码如下:\n\n```\nsrv := http.Server{\n    Addr: \":8080\",\n    Handler: router,\n}\n\ngo func() {\n    if err := srv.ListenAndServe(); err != nil \u0026\u0026 err != http.ErrServerClosed {\n        log.Fatalf(\"listen: %s\\n\", err)\n    }\n}\n\n// 其他代码, 等待关闭信号\n...\n\nctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\ndefer cancel()\nif err := srv.Shutdown(ctx); err != nil {\n    log.Fatal(\"Server Shutdown: \", err)\n}\nlog.Println(\"Server exiting\")\n```\n\n完整的代码见 [graceful-shutdown](https://github.com/gin-gonic/gin/blob/master/examples/graceful-shutdown/graceful-shutdown/server.go).\n\n\u003ca name=\"life-circle\"\u003e\u003c/a\u003e\n\n- 生命周期\n\n\u003ca name=\"context\"\u003e\u003c/a\u003e\n\n- Context\n\n\u003ca name=\"router\"\u003e\u003c/a\u003e\n\n### 路由\n\u003ca name=\"basic-router\"\u003e\u003c/a\u003e\n\n- 基本路由\ngin 框架中采用的路由库是 httprouter。\n\n\n```go\n\t// 创建带有默认中间件的路由:\n\t// 日志与恢复中间件\n\trouter := gin.Default()\n\t//创建不带中间件的路由：\n\t//r := gin.New()\n\n\trouter.GET(\"/someGet\", getting)\n\trouter.POST(\"/somePost\", posting)\n\trouter.PUT(\"/somePut\", putting)\n\trouter.DELETE(\"/someDelete\", deleting)\n\trouter.PATCH(\"/somePatch\", patching)\n\trouter.HEAD(\"/someHead\", head)\n\trouter.OPTIONS(\"/someOptions\", options)\n```\n\n\u003ca name=\"router-param\"\u003e\u003c/a\u003e\n\n- 路由参数\n\napi 参数通过Context的Param方法来获取\n\n```\nrouter.GET(\"/string/:name\", func(c *gin.Context) {\n    \tname := c.Param(\"name\")\n    \tfmt.Println(\"Hello %s\", name)\n    })\n```\n\nURL 参数通过 DefaultQuery 或 Query 方法获取\n\n```\n// url 为 http://localhost:8080/welcome?name=ningskyer时\n// 输出 Hello ningskyer\n// url 为 http://localhost:8080/welcome时\n// 输出 Hello Guest\nrouter.GET(\"/welcome\", func(c *gin.Context) {\n\tname := c.DefaultQuery(\"name\", \"Guest\") //可设置默认值\n\t// 是 c.Request.URL.Query().Get(\"lastname\") 的简写\n\tlastname := c.Query(\"lastname\") \n\tfmt.Println(\"Hello %s\", name)\n})\n```\n表单参数通过 PostForm 方法获取\n```\n//form\nrouter.POST(\"/form\", func(c *gin.Context) {\n\ttype := c.DefaultPostForm(\"type\", \"alert\")//可设置默认值\n\tmsg := c.PostForm(\"msg\")\n\ttitle := c.PostForm(\"title\")\n\tfmt.Println(\"type is %s, msg is %s, title is %s\", type, msg, title)\n})\n```\n\u003ca name=\"router-group\"\u003e\u003c/a\u003e\n\n- 路由群组\n\n```go\n\tsomeGroup := router.Group(\"/someGroup\")\n    {\n        someGroup.GET(\"/someGet\", getting)\n\t\tsomeGroup.POST(\"/somePost\", posting)\n\t}\n```\n\n\u003ca name=\"controller\"\u003e\u003c/a\u003e\n\n### 控制器\n\n\u003ca name=\"binding\"\u003e\u003c/a\u003e\n\n- 数据解析绑定\n\n模型绑定可以将请求体绑定给一个类型，目前支持绑定的类型有 JSON, XML 和标准表单数据 (foo=bar\u0026boo=baz)。\n要注意的是绑定时需要给字段设置绑定类型的标签。比如绑定 JSON 数据时，设置 `json:\"fieldname\"`。\n使用绑定方法时，Gin 会根据请求头中  Content-Type  来自动判断需要解析的类型。如果你明确绑定的类型，你可以不用自动推断，而用 BindWith 方法。\n你也可以指定某字段是必需的。如果一个字段被 `binding:\"required\"` 修饰而值却是空的，请求会失败并返回错误。\n\n```go\n// Binding from JSON\ntype Login struct {\n\tUser     string `form:\"user\" json:\"user\" binding:\"required\"`\n\tPassword string `form:\"password\" json:\"password\" binding:\"required\"`\n}\n\nfunc main() {\n\trouter := gin.Default()\n\n\t// 绑定JSON的例子 ({\"user\": \"manu\", \"password\": \"123\"})\n\trouter.POST(\"/loginJSON\", func(c *gin.Context) {\n\t\tvar json Login\n\n\t\tif c.BindJSON(\u0026json) == nil {\n\t\t\tif json.User == \"manu\" \u0026\u0026 json.Password == \"123\" {\n\t\t\t\tc.JSON(http.StatusOK, gin.H{\"status\": \"you are logged in\"})\n\t\t\t} else {\n\t\t\t\tc.JSON(http.StatusUnauthorized, gin.H{\"status\": \"unauthorized\"})\n\t\t\t}\n\t\t}\n\t})\n\n\t// 绑定普通表单的例子 (user=manu\u0026password=123)\n\trouter.POST(\"/loginForm\", func(c *gin.Context) {\n\t\tvar form Login\n\t\t// 根据请求头中 content-type 自动推断.\n\t\tif c.Bind(\u0026form) == nil {\n\t\t\tif form.User == \"manu\" \u0026\u0026 form.Password == \"123\" {\n\t\t\t\tc.JSON(http.StatusOK, gin.H{\"status\": \"you are logged in\"})\n\t\t\t} else {\n\t\t\t\tc.JSON(http.StatusUnauthorized, gin.H{\"status\": \"unauthorized\"})\n\t\t\t}\n\t\t}\n\t})\n\t// 绑定多媒体表单的例子 (user=manu\u0026password=123)\n\trouter.POST(\"/login\", func(c *gin.Context) {\n\t\tvar form LoginForm\n\t\t// 你可以显式声明来绑定多媒体表单：\n\t\t// c.BindWith(\u0026form, binding.Form)\n\t\t// 或者使用自动推断:\n\t\tif c.Bind(\u0026form) == nil {\n\t\t\tif form.User == \"user\" \u0026\u0026 form.Password == \"password\" {\n\t\t\t\tc.JSON(200, gin.H{\"status\": \"you are logged in\"})\n\t\t\t} else {\n\t\t\t\tc.JSON(401, gin.H{\"status\": \"unauthorized\"})\n\t\t\t}\n\t\t}\n\t})\n\t// Listen and serve on 0.0.0.0:8080\n\trouter.Run(\":8080\")\n}\n```\n\u003ca name=\"request\"\u003e\u003c/a\u003e\n\n### 请求\n\u003ca name=\"request-header\"\u003e\u003c/a\u003e\n\n- 请求头\n\n\u003ca name=\"request-params\"\u003e\u003c/a\u003e\n\n- 请求参数\n\n\u003ca name=\"request-cookie\"\u003e\u003c/a\u003e\n\n- Cookies\n\n\u003ca name=\"upload\"\u003e\u003c/a\u003e\n\n- 上传文件\n\n```\nrouter.POST(\"/upload\", func(c *gin.Context) {\n\n    file, header , err := c.Request.FormFile(\"upload\")\n    filename := header.Filename\n    fmt.Println(header.Filename)\n    out, err := os.Create(\"./tmp/\"+filename+\".png\")\n    if err != nil {\n        log.Fatal(err)\n    }\n    defer out.Close()\n    _, err = io.Copy(out, file)\n    if err != nil {\n        log.Fatal(err)\n    }   \n})\n```\n\u003ca name=\"response\"\u003e\u003c/a\u003e\n\n### 响应\n\u003ca name=\"response-header\"\u003e\u003c/a\u003e\n\n- 响应头\n\n\u003ca name=\"response-cookie\"\u003e\u003c/a\u003e\n\n- 附加Cookie\n\n\u003ca name=\"response-string\"\u003e\u003c/a\u003e\n\n- 字符串响应\n\n```\nc.String(http.StatusOK, \"some string\")\n```\n\u003ca name=\"response-json\"\u003e\u003c/a\u003e\n\n- JSON/XML/YAML响应\n\n```\nr.GET(\"/moreJSON\", func(c *gin.Context) {\n\t// You also can use a struct\n\tvar msg struct {\n\t\tName    string `json:\"user\" xml:\"user\"`\n\t\tMessage string\n\t\tNumber  int\n\t}\n\tmsg.Name = \"Lena\"\n\tmsg.Message = \"hey\"\n\tmsg.Number = 123\n\t// 注意 msg.Name 变成了 \"user\" 字段\n\t// 以下方式都会输出 :   {\"user\": \"Lena\", \"Message\": \"hey\", \"Number\": 123}\n\tc.JSON(http.StatusOK, gin.H{\"user\": \"Lena\", \"Message\": \"hey\", \"Number\": 123})\n\tc.XML(http.StatusOK, gin.H{\"user\": \"Lena\", \"Message\": \"hey\", \"Number\": 123})\n\tc.YAML(http.StatusOK, gin.H{\"user\": \"Lena\", \"Message\": \"hey\", \"Number\": 123})\n\tc.JSON(http.StatusOK, msg)\n\tc.XML(http.StatusOK, msg)\n\tc.YAML(http.StatusOK, msg)\n})\n\t\t\n```\n\u003ca name=\"response-view\"\u003e\u003c/a\u003e\n\n- 视图响应\n\n先要使用 LoadHTMLTemplates() 方法来加载模板文件\n\n```go\nfunc main() {\n\trouter := gin.Default()\n\t//加载模板\n\trouter.LoadHTMLGlob(\"templates/*\")\n\t//router.LoadHTMLFiles(\"templates/template1.html\", \"templates/template2.html\")\n\t//定义路由\n\trouter.GET(\"/index\", func(c *gin.Context) {\n\t\t//根据完整文件名渲染模板，并传递参数\n\t\tc.HTML(http.StatusOK, \"index.tmpl\", gin.H{\n\t\t\t\"title\": \"Main website\",\n\t\t})\n\t})\n\trouter.Run(\":8080\")\n}\n```\n\n模板结构定义\n\n```html\n\u003chtml\u003e\n\t\u003ch1\u003e\n\t\t{{ .title }}\n\t\u003c/h1\u003e\n\u003c/html\u003e\n```\n不同文件夹下模板名字可以相同，此时需要 LoadHTMLGlob() 加载两层模板路径\n\n```go\nrouter.LoadHTMLGlob(\"templates/**/*\")\nrouter.GET(\"/posts/index\", func(c *gin.Context) {\n\tc.HTML(http.StatusOK, \"posts/index.tmpl\", gin.H{\n\t\t\"title\": \"Posts\",\n\t})\n\tc.HTML(http.StatusOK, \"users/index.tmpl\", gin.H{\n\t\t\"title\": \"Users\",\n\t})\n\t\n}\n```\n\ntemplates/posts/index.tmpl\n```html\n\u003c!-- 注意开头 define 与结尾 end 不可少 --\u003e\n{{ define \"posts/index.tmpl\" }}\n\u003chtml\u003e\u003ch1\u003e\n\t{{ .title }}\n\u003c/h1\u003e\n\u003c/html\u003e\n{{ end }}\n\ngin也可以使用自定义的模板引擎，如下\n\n```go\nimport \"html/template\"\n\nfunc main() {\n\trouter := gin.Default()\n\thtml := template.Must(template.ParseFiles(\"file1\", \"file2\"))\n\trouter.SetHTMLTemplate(html)\n\trouter.Run(\":8080\")\n}\n```\n\u003ca name=\"response-file\"\u003e\u003c/a\u003e\n\n- 文件响应\n\n```\n//获取当前文件的相对路径\nrouter.Static(\"/assets\", \"./assets\")\n//\nrouter.StaticFS(\"/more_static\", http.Dir(\"my_file_system\"))\n//获取相对路径下的文件\nrouter.StaticFile(\"/favicon.ico\", \"./resources/favicon.ico\")\n\n```\n\u003ca name=\"response-redirect\"\u003e\u003c/a\u003e\n\n- 重定向\n\n```\nr.GET(\"/redirect\", func(c *gin.Context) {\n\t//支持内部和外部的重定向\n    c.Redirect(http.StatusMovedPermanently, \"http://www.baidu.com/\")\n})\n```\n\u003ca name=\"sync-async\"\u003e\u003c/a\u003e\n\n- 同步异步\n\ngoroutine 机制可以方便地实现异步处理\n\n```go\nfunc main() {\n\tr := gin.Default()\n\t//1. 异步\n\tr.GET(\"/long_async\", func(c *gin.Context) {\n\t\t// goroutine 中只能使用只读的上下文 c.Copy()\n\t\tcCp := c.Copy()\n\t\tgo func() {\n\t\t\ttime.Sleep(5 * time.Second)\n\n\t\t\t// 注意使用只读上下文\n\t\t\tlog.Println(\"Done! in path \" + cCp.Request.URL.Path)\n\t\t}()\n\t})\n\t//2. 同步\n\tr.GET(\"/long_sync\", func(c *gin.Context) {\n\t\ttime.Sleep(5 * time.Second)\n\n\t\t// 注意可以使用原始上下文\n\t\tlog.Println(\"Done! in path \" + c.Request.URL.Path)\n\t})\n\n\t// Listen and serve on 0.0.0.0:8080\n\tr.Run(\":8080\")\n}\n```\n\u003ca name=\"view\"\u003e\u003c/a\u003e\n\n### 视图\n\u003ca name=\"view-param\"\u003e\u003c/a\u003e\n\n- 传参\n\n\u003ca name=\"view-unit\"\u003e\u003c/a\u003e\n\n- 视图组件\n\n\u003ca name=\"middleware\"\u003e\u003c/a\u003e\n\n### 中间件\n\u003ca name=\"middleware-use\"\u003e\u003c/a\u003e\n\n- 分类使用方式\n```\n// 1.全局中间件\nrouter.Use(gin.Logger())\nrouter.Use(gin.Recovery())\n\n// 2.单路由的中间件，可以加任意多个\nrouter.GET(\"/benchmark\", MyMiddelware(), benchEndpoint)\n\n// 3.群组路由的中间件\nauthorized := router.Group(\"/\", MyMiddelware())\n// 或者这样用：\nauthorized := router.Group(\"/\")\nauthorized.Use(MyMiddelware())\n{\n\tauthorized.POST(\"/login\", loginEndpoint)\n}\n```\n\u003ca name=\"middleware-create\"\u003e\u003c/a\u003e\n\n- 自定义中间件\n\n```go\n//定义\nfunc Logger() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tt := time.Now()\n\n\t\t// 在gin上下文中定义变量\n\t\tc.Set(\"example\", \"12345\")\n\n\t\t// 请求前\n\n\t\tc.Next()//处理请求\n\n\t\t// 请求后\n\t\tlatency := time.Since(t)\n\t\tlog.Print(latency)\n\n\t\t// access the status we are sending\n\t\tstatus := c.Writer.Status()\n\t\tlog.Println(status)\n\t}\n}\n//使用\nfunc main() {\n\tr := gin.New()\n\tr.Use(Logger())\n\n\tr.GET(\"/test\", func(c *gin.Context) {\n\t\t//获取gin上下文中的变量\n\t\texample := c.MustGet(\"example\").(string)\n\n\t\t// 会打印: \"12345\"\n\t\tlog.Println(example)\n\t})\n\n\t// 监听运行于 0.0.0.0:8080\n\tr.Run(\":8080\")\n}\n```\n\n\u003ca name=\"middleware-param\"\u003e\u003c/a\u003e\n\n- 中间件参数\n\n- 内置中间件\n1.简单认证BasicAuth\n\n```go\n// 模拟私有数据\nvar secrets = gin.H{\n\t\"foo\":    gin.H{\"email\": \"foo@bar.com\", \"phone\": \"123433\"},\n\t\"austin\": gin.H{\"email\": \"austin@example.com\", \"phone\": \"666\"},\n\t\"lena\":   gin.H{\"email\": \"lena@guapa.com\", \"phone\": \"523443\"},\n}\n\nfunc main() {\n\tr := gin.Default()\n\n\t// 使用 gin.BasicAuth 中间件，设置授权用户\n\tauthorized := r.Group(\"/admin\", gin.BasicAuth(gin.Accounts{\n\t\t\"foo\":    \"bar\",\n\t\t\"austin\": \"1234\",\n\t\t\"lena\":   \"hello2\",\n\t\t\"manu\":   \"4321\",\n\t}))\n\n\t// 定义路由\n\tauthorized.GET(\"/secrets\", func(c *gin.Context) {\n\t\t// 获取提交的用户名（AuthUserKey）\n\t\tuser := c.MustGet(gin.AuthUserKey).(string)\n\t\tif secret, ok := secrets[user]; ok {\n\t\t\tc.JSON(http.StatusOK, gin.H{\"user\": user, \"secret\": secret})\n\t\t} else {\n\t\t\tc.JSON(http.StatusOK, gin.H{\"user\": user, \"secret\": \"NO SECRET :(\"})\n\t\t}\n\t})\n\n\t// Listen and serve on 0.0.0.0:8080\n\tr.Run(\":8080\")\n}\n```\n\n2.\n\u003ca name=\"db\"\u003e\u003c/a\u003e\n\n## 数据库\n\u003ca name=\"db-mongodb\"\u003e\u003c/a\u003e\n\n- Mongodb\n\nGolang常用的Mongodb驱动为 mgo.v2, [查看文档](http://godoc.org/gopkg.in/mgo.v2)\n\nmgo 使用方式如下：\n\n```\n//定义 Person 结构，字段须为首字母大写\ntype Person struct {\n\tName string\n\tPhone string\n}\n\nrouter.GET(\"/mongo\", func(context *gin.Context){\n\t//可本地可远程，不指定协议时默认为http协议访问，此时需要设置 mongodb 的nohttpinterface=false来打开httpinterface。\n\t//也可以指定mongodb协议，如 \"mongodb://127.0.0.1:27017\"\n\tvar MOGODB_URI = \"127.0.0.1:27017\"\n\t//连接\n\tsession, err := mgo.Dial(MOGODB_URI)\n\t//连接失败时终止\n\tif err != nil {\n        panic(err)\n    }\n\t//延迟关闭，释放资源\n\tdefer session.Close()\n\t//设置模式\n    session.SetMode(mgo.Monotonic, true)\n\t//选择数据库与集合\n    c := session.DB(\"adatabase\").C(\"acollection\")\n    //插入文档\n    err = c.Insert(\u0026Person{Name:\"Ale\", Phone:\"+55 53 8116 9639\"},\n               \u0026Person{Name:\"Cla\",  Phone:\"+55 53 8402 8510\"})\n\t//出错判断\n    if err != nil {\n            log.Fatal(err)\n    }\n\t//查询文档\n    result := Person{}\n    //注意mongodb存储后的字段大小写问题\n    err = c.Find(bson.M{\"name\": \"Ale\"}).One(\u0026result)\n    //出错判断\n    if err != nil {\n        log.Fatal(err)\n    }\n    fmt.Println(\"Phone:\", result.Phone)\n})\n```\n\u003ca name=\"db-mysql\"\u003e\u003c/a\u003e\n\n- Mysql\n\n\u003ca name=\"ORM\"\u003e\u003c/a\u003e\n\n- ORM\n\n\u003ca name=\"extensions\"\u003e\u003c/a\u003e\n\n## 扩展包\n\n\u003ca name=\"functions\"\u003e\u003c/a\u003e\n\n### 常用方法\n- gin\n- Context\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskyhee%2Fgin-doc-cn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fskyhee%2Fgin-doc-cn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskyhee%2Fgin-doc-cn/lists"}