j

jaryue

V1

2023/03/18阅读:13主题:默认主题

gowebday4

实现基础的gee http框架

package gee

// go大写表示可以被外界访问
import (
 "fmt"
 "net/http"
)

// 定义hand函数,处理请求
type Handlerfunc func(http.ResponseWriter, *http.Request)

// 定义结构体实现函数hand
type Engin struct {
 router map[string]Handlerfunc
}

// 初始化engin
func New() *Engin {
 return &Engin{router: make(map[string]Handlerfunc)}
}

// 添加路由映射
func (engin *Engin) addroute(method string, pettern string, hander Handlerfunc) {
 key := method + "-" + pettern
 //
 engin.router[key] = hander
}

// 定义get方法
func (engin *Engin) GET(pattern string, handler Handlerfunc) {
 engin.addroute("GET", pattern, handler)
}

// 定义post方法;参数:一个是 路径字段,一个是处理函数
func (engin *Engin) POSE(pattern string, handler Handlerfunc) {
 // 调用add函数添加路由映射
 engin.addroute("POST", pattern, handler)
}

// ---------------------------------------------
// 定义serve函数
func (engin *Engin) ServeHTTP(w http.ResponseWriter, req *http.Request) {
 // 查找映射字段
 key := req.Method + "-" + req.URL.Path
 if handler, ok := engin.router[key]; ok { //查找成功成功就执行hander函数
  handler(w, req)
 } else { //失败就返回404
  fmt.Fprintf(w, "404 NOT FOUND: %s\n", req.URL)
 }
}

// 启动http服务;监听addr端口,并执行engin接口,当用户访问,执行servehttp函数
func (engin *Engin) Run(addr string) (err error) {
 return http.ListenAndServe(addr, engin)
}

之前我们写到我们可以用servehttp函数来定义用户处理函数,但是我们需要用swich,case语句来定义访问的路径,也能实现功能 而用这个addroute方法将路径添加到映射中,value就是处理的函数,就是说当用户访问路径的时候就会直接映射出处理的函数,这样当处理函数很多的时候就不用一个个的case了,维护起来也相对方便一点

分类:

后端

标签:

Golang

作者介绍

j
jaryue
V1