真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

golang利用不到20行代碼實(shí)現(xiàn)路由調(diào)度詳解-創(chuàng)新互聯(lián)

前言

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比蒙自網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式蒙自網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋蒙自地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。

本文主要介紹了關(guān)于golang實(shí)現(xiàn)路由調(diào)度的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧

項(xiàng)目地址

github (本地下載)

本項(xiàng)目依賴

使用標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn),無(wú)額外依賴

為什么需要路由調(diào)度層

golang http標(biāo)準(zhǔn)庫(kù)只能精確匹配請(qǐng)求的URI,然后執(zhí)行handler?,F(xiàn)在一般web項(xiàng)目都至少有個(gè)Controller層,以struct實(shí)現(xiàn),根據(jù)不同的請(qǐng)求路徑派發(fā)到不同的方法中去。

路由調(diào)度器定義

由于golang暫時(shí)還不可以動(dòng)態(tài)創(chuàng)建對(duì)象(比如java的Class.forName("xxx").newInstance(),xxx是任意存在的class名稱)。所以需要手動(dòng)注冊(cè)一下controller關(guān)系。

  1. 定義routes保存controller指針
  2. 解析請(qǐng)求過(guò)來(lái)的URL查詢參數(shù),暫定a為action名稱,c為controller名稱,本文偷了下懶,沒(méi)對(duì)PATH_INFO做處理,也沒(méi)有對(duì)actionName的首字母自動(dòng)大寫,這個(gè)不影響本文要傳達(dá)的核心內(nèi)容,有興趣的讀者可以自行實(shí)現(xiàn)。
  3. 根據(jù)URL中的controllerName找到對(duì)應(yīng)的controller
  4. 使用反射將當(dāng)前請(qǐng)求對(duì)象的*http.Request和http.ResponseWriter設(shè)置到該Controller
  5. 使用反射以及actionName對(duì)應(yīng)該controller的方法

由于golang的繼承不是一般的OOP,所以也沒(méi)有父子類這種說(shuō)法,路由注冊(cè)那里只能使用interface{}

代碼實(shí)現(xiàn)

app/app.go

該文件為核心調(diào)度文件

package app

import (
 "net/http"
 "reflect"
 "fmt"
)

type application struct {
 routes map[string]interface{}
}

func New() *application {
 return &application{
  routes: make(map[string]interface{}),
 }
}

func (p *application) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 controllerName := r.URL.Query().Get("c")
 actionName := r.URL.Query().Get("a")
 if controllerName == "" || actionName == "" {
  http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
  return
 }
 route, ok := p.routes[controllerName]
 if !ok {
  http.Error(w, "Controller Not Found", http.StatusNotFound)
  return
 }
 ele := reflect.ValueOf(route).Elem()
 ele.FieldByName("Request").Set(reflect.ValueOf(r))
 ele.FieldByName("Response").Set(reflect.ValueOf(w))
 ele.MethodByName(actionName).Call([]reflect.Value{})
}

func (p *application) printRoutes() {
 for route, controller := range p.routes {
  ele := reflect.ValueOf(controller).Type().String()
  fmt.Printf("%s %s\n", route, ele)
 }
}

func (p *application) Get(route string, controller interface{}) {
 p.routes[route] = controller
}

func (p *application) Run(addr string) error {
 p.printRoutes()
 fmt.Printf("listen on %s\n", addr)
 return http.ListenAndServe(addr, p)
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


本文標(biāo)題:golang利用不到20行代碼實(shí)現(xiàn)路由調(diào)度詳解-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://weahome.cn/article/cocpoi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部