本文主要介绍了关于golang实现路由调度的相关内容,分享出来供大家参考学习、下面话不多说了,来一起看看详细的介绍吧
github (本地下载)
使用标准库实现,无额外依赖
golang http标准库只能精确匹配请求的URI,然后执行处理器。现在一般web项目都至少有个控制器层,以结构实现,根据不同的请求路径派发到不同的方法中去。
引用>
由于golang暂时还不可以动态创建对象(比如java的forname (“xxx”) .newInstance (), xxx是任意存在的类名称),所以需要手动注册一下控制器关系。
<李>定义路线保存控制器指针李> <李>解析请求过来的网址查询参数,暂定为操作名称,c为控制器名称,本文偷了下懒,没对PATH_INFO做处理,也没有对actionName的首字母自动大写,这个不影响本文要传达的核心内容,有兴趣的读者可以自行实现。李> <李>根据URL中的controllerName找到对应的控制器李> <李>使用反射将当前请求对象的* http.Request和http.ResponseWriter设置到该控制器李> <李>使用反射以及actionName对应该控制器的方法李>
由于golang的继承不是一般的OOP,所以也没有父子类这种说法,路由注册那里只能使界面用{}
<强>应用程序/应用程序。去强>
该文件为核心调度文件
包应用
导入( “net/http” “反映” “fmt” ) 类型的应用程序结构{ 路线map [string]接口{} } 函数的新应用程序()* { 返回应用程序,{ 路线:{})(map [string]接口, } } func (p *应用程序)ServeHTTP http (w。ResponseWriter r * http.Request) { controllerName:=r.URL.Query () . get (“c”) actionName:=r.URL.Query () . get (“”) 如果controllerName==" " | | actionName==" { http。错误(w, http.StatusText (http.StatusBadRequest) http.StatusBadRequest) 返回 } 路线,ok:=p.routes [controllerName] 如果!好{ http。错误(w,控制器没有找到,http.StatusNotFound) 返回 } 避署:=reflect.ValueOf(路线).Elem () ele.FieldByName(“请求”)这里(reflect.ValueOf (r)) ele.FieldByName(“响应”)这里(reflect.ValueOf (w)) ele.MethodByName (actionName)打电话给([]reflect.Value {}) } func (p *应用程序)printRoutes () { 路线,控制器:=p。路线{ 避署:=reflect.ValueOf(控制器).Type () .String () fmt。Printf (" % s % s \ n ",路线,避署) } } func (p *应用程序)得到(路径字符串,控制器接口{}){ p。路线(路线)=控制器 } func (p *应用程序)运行错误(addr字符串){ p.printRoutes () fmt.Printf(“听> 打包应用程序 进口"net/http” 类型控制器结构{ 响应http.ResponseWriter 请求* http.Request }控制器/网站。去
具体业务逻辑类
包控制器 导入( “fmt” “应用程序” ) SiteController struct类型{ app.Controller } func (p SiteController)指数(){ fmt.Fprint (p。反应,p.Request.RequestURI) }主要。去
入口文件
主要包 导入( _ "github.com/go-sql-driver/mysql” “应用程序” “控制器” ) 函数main () { 应用范围:=app.New () 应用程序。Get(“网站”,controllers.SiteController {}) application.Run (“8080”) }
启动进程
访问http://localhost: 8080 & # 63; c=site&=指数会输出/& # 63;c=site&=指数
希望这个小小的项目能启发到各位读者,早日开发出适合自己的网框架!
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
golang利用不到20行代码实现路由调度详解