参考文档
Gin: https://gin-gonic.com/zh-cn/docs/quickstart/
net/http: https://pkg.go.dev/net/http
代码分析
package main
import (
"fmt"
"time" // 时间包
"net/http" // 提供了HTTP客户端和服务端的实现
"github.com/gin-gonic/gin" // gin框架
)
func main() {
// 返回Gin的`type Engine struct{}`,里面包含RouterGroup,
// 相当于创建一个路由Handlers, 可以后期绑定各类的路由规则和函数/中间件等
router := gin.Default()
// 创建不同的HTTP方法绑定到Handlers中,支持POST/PUT等常用Restful方法
// gin.Context: Context是gin中的上下文,允许我们在中间件之间传递变量
// 管理流、验证JSON请求、响应json请求等,在gin中包含大量Context的方法
// 例如常用的DefaultQuery、Query、DefaultPostForm、PostForm等
router.GET("/test", func(c *gin.Context) {
// 响应json格式类型
// gin.H{}就是一个map[string]interface{}
c.JSON(200, gin.H{
"message": "test",
})
})
s := &http.Server{
Addr: ":8080",
Handler: router,
ReadTimeout: 60 * time.Second,
WriteTimeout: 60 * time.Second,
MaxHeaderBytes: 1 << 20,
}
s.ListenAndServe()
}
&http.Server 和 ListenAndServe
# http.Server
type Server struct {
Addr string //监听的TCP地址,格式为:8000
Handler Handler // http句柄,实质为ServeHTTP,用于处理程序响应HTTP请求
TLSConfig *tls.Config // 安全传输层协议(TLS)配置
ReadTimeout time.Duration // 允许读取的最大时间
ReadHeaderTimeout time.Duration // 允许读取请求头的最大时间
WriteTimeout time.Duration // 允许写入的最大时间
IdleTimeout time.Duration // 等待的最大时间
MaxHeaderBytes int // 请求头的最大字节数
ConnState func(net.Conn, ConnState) // 指定一个可选的回调函数,当客户端连接时发生变化时调用
ErrorLog *log.Logger //指定一个可选的日志记录器
...
}
# ListenAndServe
func (srv *Server) ListenAndServe() error {
if srv.shuttingDown() {
return ErrServerClosed
}
addr := srv.Addr
if addr == "" {
addr = ":http"
}
ln, err := net.Listen("tcp", addr)
if err != nil {
return err
}
return srv.Serve(ln)
}
开启监听服务,监听TCP网络地址,Addr和调用调用应用程序处理连接上的请求
我们在源码中看到Addr是调用我们在&http.Server中设置的参数,因此我们在
设置时要用&,我们要改变参数的值,因为我们ListenAndServe和其他一些方法
需要用到&http.Server中的参数,他们是相互影响的。