前言
首先golang 原生的net/http就已经很强大了,正因如此,手写框架的门槛就很低了,所以既python之后的go,框架多之又多,那不如我们自己写一个看看效果
目录
scgo/
|__api
| └──Controller.go
├── router
│ └── Router.go
├── stock
│ └── RouterStock.go
├── scgo.go
原理
核心点:实现http.server.go中这个接口
RouterStock.go
这是一个存放url的map集合同时也是Handler的实现类
我们的Controller就是一个一个的Handler是实现类,而更关键的RouterStock也是一个Handler的实现类,它的存在是为了做请求转发
package stock
import "net/http"
//仓库
type RouterStock struct {
routerStock map[string]http.Handler
}
func RouterStockInit() *RouterStock{
return &RouterStock{
make(map[string]http.Handler),
}
}
//url-handler入库存储我们的Controller就是一个又一个Hander
func (h *RouterStock) AddRouterStock(url string,handler http.Handler) {
h.routerStock[url] = handler
}
//转发基站-请求转发
func (h *RouterStock)ServeHTTP(resp http.ResponseWriter, req *http.Request) {
urlPath := req.URL.Path
if hl, ok := h.routerStock[urlPath]; ok {
hl.ServeHTTP(resp, req)
return
}
http.NotFound(resp, req)
}
Controller.go
package api
import "net/http"
type HelloController struct {
}
func (h *HelloController) ServeHTTP(w http.ResponseWriter,req *http.Request) {
w.Write([]byte("hello scgo"))
}
Router.go
这是我们的路由表,用来初始化路由仓库
package router
import (
"scgo/api"
"scgo/stock"
)
func InitRouter() *stock.RouterStock{
router := stock.RouterStockInit()
router.AddRouterStock("/hello/scgo/", &api.HelloController{})
return router
}
scgo.go启动类
package main
import (
"flag"
"gin/mux"
"net/http"
router2 "scgo/router"
)
func main() {
flag.StringVar(&mux.Port, "port", ":8080", "port to listen")
flag.Parse()
router := router2.InitRouter()
http.ListenAndServe(mux.Port, router)
}
流程图
测试
总结
go语言延展性很强,它不像是java那样生态已经十分十分健全了,它的可拓展性是很强的,不妨为了学习而创造