前言

由于对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…