gin简介
gin是用Go语言写的后端web框架,简洁、轻量、支持高并发,
官方网站:https://gin-gonic.github.io/gin/
Github地址:https://github.com/gin-gonic/gin
下载
go get -u github.com/gin-gonic/gin
源码结构如下
sszxr:gin sszxr$ pwd
/Users/sszxr/go/src/github.com/gin-gonic/gin
sszxr:gin sszxr$ tree
.
├── AUTHORS.md
├── BENCHMARKS.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── auth.go
├── auth_test.go
├── benchmarks_test.go
├── binding
│ ├── binding.go
│ ├── binding_body_test.go
│ ├── binding_test.go
│ ├── default_validator.go
│ ├── form.go
│ ├── form_mapping.go
│ ├── json.go
│ ├── msgpack.go
│ ├── protobuf.go
│ ├── query.go
│ ├── uri.go
│ ├── validate_test.go
│ ├── xml.go
│ └── yaml.go
├── codecov.yml
├── context.go
├── context_17.go
├── context_17_test.go
├── context_appengine.go
├── context_pre17.go
├── context_test.go
├── debug.go
├── debug_test.go
├── deprecated.go
├── deprecated_test.go
├── doc.go
├── docs
│ └── how-to-build-an-effective-middleware.md
├── errors.go
├── errors_test.go
├── examples
│ ├── app-engine
│ │ ├── README.md
│ │ ├── app.yaml
│ │ └── hello.go
│ ├── assets-in-binary
│ │ ├── README.md
│ │ ├── assets.go
│ │ ├── html
│ │ │ ├── bar.tmpl
│ │ │ └── index.tmpl
│ │ └── main.go
│ ├── auto-tls
│ │ ├── example1
│ │ │ └── main.go
│ │ └── example2
│ │ └── main.go
│ ├── basic
│ │ ├── main.go
│ │ └── main_test.go
│ ├── custom-validation
│ │ └── server.go
│ ├── favicon
│ │ ├── favicon.ico
│ │ └── main.go
│ ├── graceful-shutdown
│ │ ├── close
│ │ │ └── server.go
│ │ └── graceful-shutdown
│ │ └── server.go
│ ├── grpc
│ │ ├── README.md
│ │ ├── gin
│ │ │ └── main.go
│ │ ├── grpc
│ │ │ └── server.go
│ │ └── pb
│ │ ├── helloworld.pb.go
│ │ └── helloworld.proto
│ ├── http-pusher
│ │ ├── assets
│ │ │ └── app.js
│ │ ├── main.go
│ │ └── testdata
│ │ ├── ca.pem
│ │ ├── server.key
│ │ └── server.pem
│ ├── http2
│ │ ├── README.md
│ │ ├── main.go
│ │ └── testdata
│ │ ├── ca.pem
│ │ ├── server.key
│ │ └── server.pem
│ ├── multiple-service
│ │ └── main.go
│ ├── realtime-advanced
│ │ ├── Makefile
│ │ ├── main.go
│ │ ├── resources
│ │ │ ├── room_login.templ.html
│ │ │ └── static
│ │ │ ├── epoch.min.css
│ │ │ ├── epoch.min.js
│ │ │ ├── prismjs.min.css
│ │ │ ├── prismjs.min.js
│ │ │ └── realtime.js
│ │ ├── rooms.go
│ │ ├── routes.go
│ │ └── stats.go
│ ├── realtime-chat
│ │ ├── Makefile
│ │ ├── main.go
│ │ ├── rooms.go
│ │ └── template.go
│ ├── struct-lvl-validations
│ │ ├── README.md
│ │ └── server.go
│ ├── template
│ │ └── main.go
│ └── upload-file
│ ├── multiple
│ │ ├── main.go
│ │ └── public
│ │ └── index.html
│ └── single
│ ├── main.go
│ └── public
│ └── index.html
├── fs.go
├── gin.go
├── ginS
│ ├── README.md
│ └── gins.go
├── gin_integration_test.go
├── gin_test.go
├── githubapi_test.go
├── go.mod
├── go.sum
├── internal
│ └── json
│ ├── json.go
│ └── jsoniter.go
├── logger.go
├── logger_test.go
├── middleware_test.go
├── mode.go
├── mode_test.go
├── path.go
├── path_test.go
├── recovery.go
├── recovery_test.go
├── render
│ ├── data.go
│ ├── html.go
│ ├── json.go
│ ├── json_17.go
│ ├── msgpack.go
│ ├── protobuf.go
│ ├── reader.go
│ ├── redirect.go
│ ├── render.go
│ ├── render_17_test.go
│ ├── render_test.go
│ ├── text.go
│ ├── xml.go
│ └── yaml.go
├── response_writer.go
├── response_writer_1.7.go
├── response_writer_1.8.go
├── response_writer_test.go
├── routergroup.go
├── routergroup_test.go
├── routes_test.go
├── test_helpers.go
├── testdata
│ ├── certificate
│ │ ├── cert.pem
│ │ └── key.pem
│ ├── protoexample
│ │ ├── test.pb.go
│ │ └── test.proto
│ └── template
│ ├── hello.tmpl
│ └── raw.tmpl
├── tools.go
├── tree.go
├── tree_test.go
├── utils.go
├── utils_test.go
├── vendor
│ └── vendor.json
└── version.go
45 directories, 150 files
sszxr:gin sszxr$ find . -name '*.go' | wc -l
104
sszxr:gin sszxr$
源码并不多,总共104个go文件,主要代码在【gin.go
,context.go
】这两个go文件中,所以阅读源码首先从这两个go文件入手。
示例用法在【examples
】文件夹下,具体怎么用,可以看该文件夹下的用法示例。
三种模式
gin有三种模式,分别为:调试模式,发布模式,测试模式
const (
// DebugMode indicates gin mode is debug.
DebugMode = "debug"
// ReleaseMode indicates gin mode is release.
ReleaseMode = "release"
// TestMode indicates gin mode is test.
TestMode = "test"
)
const (
debugCode = iota
releaseCode
testCode
)
默认是【debug】模式
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
engine.Run()
}
运行,可以看到,下面提示了debug模式,监听的端口,
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
两行代码,就注册好了一个web服务器,并启动了服务器,
engine := gin.Default()
engine.Run()
这里的Run()
函数有一个参数,用来设置端口,如果不设置,那么默认是8080
端口。
前面说了,默认是debug
模式,那么如何修改模式呢,
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
//设置模式,设置模式要放在调用Default()函数之前
gin.SetMode(gin.ReleaseMode)
engine := gin.Default()
//查看模式
fmt.Println(gin.Mode())
engine.Run()
}
注意,设置模式要放在注册路由gin.Default()
之前,如果放在后面,虽然查看模式的时候,发现已经是release
模式了,但是还是会打印一些debug
信息,因为Default
函数里面默认是debug
模式,并且会打印一些debug
信息,会显得混乱。