時(shí)間:2023-07-05 14:48:01 | 來源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-07-05 14:48:01 來源:網(wǎng)站運(yùn)營(yíng)
Go學(xué)習(xí)筆記 試著做一個(gè)Web框架:Go語言的Web框架有非常多,在日常開發(fā)中使用的有: beego、gin、revel等。這些框架也是一部分初學(xué)者的起點(diǎn),這個(gè)系列的文章將會(huì)記錄一個(gè)Web框架的開發(fā)歷程。package mainimport ( "net/http")func main() { http.HandleFunc("/ping", pingHandlerFunc) http.ListenAndServe(":9527", nil)}func pingHandlerFunc(w http.ResponseWriter, r *http.Request) { w.Write([]byte("pong"))}
這里發(fā)現(xiàn)有三個(gè)點(diǎn),一個(gè)是main函數(shù)中的http.HandleFunc方法,另一個(gè)是http.ListenAndServe,最后是pingHandlerFunc。type ( // Router is the registry of all registered routes for an `Echo` instance for // request matching and URL path parameter parsing. Router struct { tree *node routes map[string]*Route echo *Echo } node struct { //省略了node的內(nèi)容 } kind uint8 children []*node methodHandler struct { //這里是存放不同method的handler func的,省略一些內(nèi)容 get HandlerFunc })
因?yàn)橐婚_始并不想搞得太復(fù)雜,這里暫時(shí)使用slice來保存。type Router struct { // 路由表 Handlers []*RouterMapping}
pattern與handler func存在著映射關(guān)系(路由表),這里可以用map的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),在這里使用一個(gè)struct來作為Entity來保存映射的關(guān)系。type RouterMapping struct { Pattern string HandlerFunc RequestHandler}
Handler Func// Context is the most important part of gin. It allows us to pass variables between middleware,// manage the flow, validate the JSON of a request and render a JSON response for example.type Context struct { Request *http.Request Writer ResponseWriter}
Context的生存周期通常貫穿整個(gè)請(qǐng)求-響應(yīng)的過程。type Context struct { Writer http.ResponseWriter Request *http.Request}
定義一個(gè)type,這是用戶需要實(shí)現(xiàn)的Handler Functype RequestHandler func(context *Context)
到目前,我們已經(jīng)將go的Handler Func包裝完成。type Engine struct { delims render.Delims HTMLRender render.HTMLRender FuncMap template.FuncMap trees methodTrees maxParams uint16}
按照設(shè)計(jì)的思路,編寫代碼:type Engine struct { Router *Router}
添加RunAndListen方法,這里需要將之Router中的路由表項(xiàng)(Handlers)進(jìn)行注冊(cè)。func (e *Engine) RunAndListen(addr string) { for _, handler := range e.Router.Handlers { http.HandleFunc(handler.Pattern, func(writer http.ResponseWriter, request *http.Request) { handler.HandlerFunc(&Context{ Writer: writer, Request: request, }) }) } log.Fatal(http.ListenAndServe(addr, nil))}
測(cè)試一下:func TestRunAndListen() { e := NewEngine() e.Router.AddHandler("/ping", func(context *Context) { data := map[string]interface{}{ "say":"pong", } rawData,err := json.Marshal(data) if err != nil { panic(err) } context.Writer.Header().Set("Content-Type","application/json") context.Writer.Write(rawData) }) e.RunAndListen(":8090")}
訪問 http://localhost:8090/ping就能看到{ "say": "pong"}
關(guān)鍵詞:學(xué)習(xí),筆記
客戶&案例
營(yíng)銷資訊
關(guān)于我們
客戶&案例
營(yíng)銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。