golang利用不到20行代码实现路由调度详解

  

  

本文主要介绍了关于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行代码实现路由调度详解