main.go
package main import ( "net/http" "com.jtthink.net/myhttpserver/core" ) type MyHandler struct { } func(*MyHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request){ writer.Write([]byte("hello,myhandler")) } func main() { router:=core.DefaultRouter() router.Add("/",&NewsController{}) http.ListenAndServe(":8099",router) }
NewsController.go
package main import "com.jtthink.net/myhttpserver/core" type NewsController struct { core.MyController } func(this *NewsController) GET() { this.Ctx.WriteString("this is newscontroller") } func(this *NewsController) POST() { this.Ctx.WriteString("this is newscontroller for POST") }
MyRouter.go
package core import ( "net/http" ) type MyHandlerFunc func(ctx *MyContext) type MyRouter struct { Mapping map[string]ControllerInterface } func DefaultRouter() *MyRouter { return &MyRouter{make(map[string]ControllerInterface)} } //加入 path 和Controller的对应关系 func(this *MyRouter) Add(path string,c ControllerInterface) { this.Mapping[path]=c } func(this *MyRouter) ServeHTTP(writer http.ResponseWriter, request *http.Request){ //chrome 会默认请求图标地址 if f,OK:=this.Mapping[request.URL.Path];OK{ f.Init(&MyContext{request,writer}) //关键代码 if request.Method=="GET"{//没有做防错处理 f.GET() } if request.Method=="POST"{//没有做防错处理 f.POST() } } }
MyController.go
package core type MyController struct { Ctx *MyContext } func(this *MyController) Init (ctx *MyContext) { this.Ctx=ctx } type ControllerInterface interface { Init(ctx *MyContext) GET() POST() }
MyContext.go
package core import "net/http" type MyContext struct { //上下文对象 request *http.Request http.ResponseWriter } func(this *MyContext) WriteString(str string){ this.Write([]byte(str)) }
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/11260973.html