前言
由于对Go语言的认知到了一定程度,很多工具在网络上都是匮乏的,羡慕那些造轮子的大佬,没什么造什么。但是造东西的前提是,先模仿。这个项目仿造了Gin。地址在这里
net/http
库
这是Go语言内置的库,封装了HTTP网络编程的基础的接口,我们实现的 Web 框架便是基于
net/http
,不过有一个备选,fasthttp,号称是比原生net/http
快10倍。不排除之后要将http换成这个,先记载在这。
在项目目录下新建GoMatrix
文件夹和同名文件(ps: 不想叫gee了)。并且使用mod作为包管理。go mod init
GoMatrix.go
:
// HandlerFunc定义使用的请求处理程序
type HandlerFunc func(http.ResponseWriter, *http.Request)
// 引擎实现ServeHTTP接口
type Engine struct {
router map[string]HandlerFunc
}
// 初始化引擎
func New() *Engine {
return &Engine{router: make(map[string]HandlerFunc)}
}
func (engine *Engine) addRoute(method string, pattern string, handler HandlerFunc) {
key := method + "-" + pattern
log.Printf("Route %4s - %s", method, pattern)
engine.router[key] = handler
}
// GET定义添加GET请求的方法
func (engine *Engine)GET(pattern string, handler HandlerFunc) {
engine.addRoute("GET", pattern, handler)
}
// 定义添加POST请求的方法
func (engine *Engine) POST(pattern string, handler HandlerFunc) {
engine.addRoute("POST", pattern, handler)
}
// 定义添加PUT请求的方法
func (engine *Engine) PUT(pattern string, handler HandlerFunc) {
engine.addRoute("PUT", pattern, handler)
}
func (engine *Engine)DELETE(pattern string, handler HandlerFunc) {
engine.addRoute("DELETE", pattern, handler)
}
// 定义启动http服务器的方法
func (engine *Engine) Run(addr string) (err error) {
return http.ListenAndServe(addr, engine)
}
// 实现Handler接口
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
key := req.Method + "-" + req.URL.Path
if handler, ok := engine.router[key]; ok {
handler(w, req)
} else {
_, _ = fmt.Fprintf(w, "404 NOT FOUND: %s\n", req.URL)
}
}
目前的目录结构为
- Go-Matrix
- main.go
- GoMatrix(folder)
- go.mod
- GoMatrix.go
接下来在main.go中:
package main
import (
"Go-Matrix/GoMatrix"
"fmt"
"net/http"
)
func main() {
r := GoMatrix.New()
r.GET("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "URL.Path = %q\n", req.URL.Path)
})
r.POST("/hello", func(w http.ResponseWriter, req *http.Request) {
for k, v := range req.Header {
fmt.Fprintf(w, "Header[%q] = %q\n", k, v)
}
})
_ = r.Run(":9999")
}
小总结
对接口理念还是没有很好的理解,作为一个从python转go过来的,还是先好好的把基础打好。
接口解析的一篇地址:https://draveness.me/golang/docs/part2-foundation/ch04-basic/golang-interface/
目前Gin框架底层还是使用的http库,或许可以借助fasthttp来从速度方面来达到或者超越Gin的地步,不过这都是后话了。
Unfinished to be continued…
- Post link: https://www.godhearing.cn/shou-xie-zi-ji-de-go-web-kuang-jia-1/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.