欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

http.HandleFunc解析-創(chuàng)新互聯(lián)

Go語(yǔ)言是一個(gè)神奇的語(yǔ)言,尤其是函數(shù)式編程,

專(zhuān)注于為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)二道免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
func HandleFunc(pattern string, handler func(ResponseWriter, *Request))

就是一個(gè)典型。這個(gè)函數(shù)就是注冊(cè)默認(rèn)路由。
HandleFunc 的第一個(gè)參數(shù)指的是請(qǐng)求路徑,第二個(gè)參數(shù)是一個(gè)函數(shù)類(lèi)型,表示這個(gè)請(qǐng)求需要處理的事情。沒(méi)有處理復(fù)雜的邏輯,而是直接給DefaultServeMux處理,如源碼:

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}

DefaultServeMux 是ServeMux一個(gè)全局實(shí)例,

// DefaultServeMux is the default ServeMux used by Serve.
var DefaultServeMux = &defaultServeMux
var defaultServeMux ServeMux

這個(gè)實(shí)例在被申明的時(shí)候初始化了,只要使用了DefaultServeMux這個(gè)變量,其實(shí)就是同一個(gè)指針而已,也就是獨(dú)一份。
DefaultServeMux.HandleFunc(pattern, handler) 函數(shù)其實(shí)也沒(méi)有做什么,直接調(diào)用路由注冊(cè):

// HandleFunc registers the handler function for the given pattern.
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    mux.Handle(pattern, HandlerFunc(handler))
}

把自定義處理業(yè)務(wù)的函數(shù)進(jìn)行路由注冊(cè),HandlerFunc(handler) 這個(gè)處理其實(shí)是類(lèi)型轉(zhuǎn)化,把函數(shù)handler func 類(lèi)型轉(zhuǎn)化成HandlerFunc類(lèi)型,是一個(gè)強(qiáng)制轉(zhuǎn)化,只要函數(shù)的參數(shù)類(lèi)型一致,即可轉(zhuǎn)化。我們來(lái)看一個(gè)HandlerFunc是如何定義的:

type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
    f(w, r)
}

從type可以看出 HandlerFunc 就是一個(gè)自定義類(lèi)型,被定義成

func(ResponseWriter, *Request)

函數(shù)。所以只要符合此標(biāo)準(zhǔn)的函數(shù),都可以轉(zhuǎn)化成HandlerFunc,而這個(gè)函數(shù)實(shí)現(xiàn)了接口:

type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

這個(gè)接口就是路由中,匹配的處理方法。

根據(jù)go對(duì)接口的定義,只有實(shí)現(xiàn)了接口的所有方法,就實(shí)現(xiàn)了這個(gè)接口。

我們來(lái)看是如何注冊(cè)路由的,需要理解如下兩個(gè)結(jié)構(gòu)

  • ServeMux 多路路由器
  • muxEntry 具體路由
type ServeMux struct {
    mu    sync.RWMutex //鎖
    m     map[string]muxEntry //路由集合
    hosts bool // whether any patterns contain hostnames
}

type muxEntry struct {
    explicit bool //是否已經(jīng)存在
    h        Handler  //路由處理邏輯 是一個(gè)接口實(shí)例  在每次匹配的時(shí)候,調(diào)用此接口的方法
    pattern  string//請(qǐng)求路徑
}

處邏輯源碼如下:

// Handle 根據(jù)給定的請(qǐng)求路勁進(jìn)行注冊(cè)路由
// 如果Handle已經(jīng)存在,就直接報(bào)錯(cuò)
func (mux *ServeMux) Handle(pattern string, handler Handler) {
 //進(jìn)行加鎖,高并發(fā)處理
    mux.mu.Lock()
    //釋放鎖
    defer mux.mu.Unlock()
 //請(qǐng)求路徑為空,直接報(bào)錯(cuò)
    if pattern == "" {
        panic("http: invalid pattern " + pattern)
    }
    //Handle不存在,直接報(bào)錯(cuò)
    if handler == nil {
        panic("http: nil handler")
    }
    //如果Handle已經(jīng)存在,就直接報(bào)錯(cuò)
    if mux.m[pattern].explicit {
        panic("http: multiple registrations for " + pattern)
    }
//路由表不存在,創(chuàng)建一個(gè),這個(gè)路由表是一個(gè)映射MAP
//key 就是請(qǐng)求路徑  value是muxEntry 包含具體路由信息
    if mux.m == nil {
        mux.m = make(map[string]muxEntry)
    }
    mux.m[pattern] = muxEntry{explicit: true, h: handler, pattern: pattern}
//如果首字母不是‘/’ 包含hostName
    if pattern[0] != '/' {
        mux.hosts = true
    }

    // Helpful behavior:
    // If pattern is /tree/, insert an implicit permanent redirect for /tree.
    // It can be overridden by an explicit registration.
    n := len(pattern)
    //如何是像/tree/ 請(qǐng)求注冊(cè)路由,而且/tree 還沒(méi)有注冊(cè)過(guò)
    if n > 0 && pattern[n-1] == '/' && !mux.m[pattern[0:n-1]].explicit {
        // If pattern contains a host name, strip it and use remaining
        // path for redirect.
        path := pattern //保存原始路徑
        if pattern[0] != '/' { //如果首字母不是 ‘/’
            // In pattern, at least the last character is a '/', so
            // strings.Index can't be -1.
            path = pattern[strings.Index(pattern, "/"):] //返回最近的/之后的串作為請(qǐng)求路徑
        }
        //構(gòu)建請(qǐng)求URL 直接重定向 而且注冊(cè)的注冊(cè)路徑有/tree/  /tree
        url := &url.URL{Path: path}
        mux.m[pattern[0:n-1]] = muxEntry{h: RedirectHandler(url.String(), StatusMovedPermanently), pattern: pattern}
    }
}

以上是對(duì)函數(shù)

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))

調(diào)用過(guò)程分析

另外有需要云服務(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ì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站題目:http.HandleFunc解析-創(chuàng)新互聯(lián)
鏈接URL:http://aaarwkj.com/article42/dihghc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、域名注冊(cè)網(wǎng)站收錄、網(wǎng)站策劃云服務(wù)器、移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)
久久精品高潮999久久久| 伊在人天堂亚洲香蕉精品区| 日韩欧美国产精品一区二区| 国产实拍之强伦奸在线观看| 美女高潮呻吟免费观看久久久 | 国产午夜福利一区在线| 精品国内日本一区二区| 亚洲精品熟女国产国产老熟女| 自拍偷拍亚洲另类激情| 97视频免费观看在线| 91一区二区三区在线| 麻豆一精品传二传媒短视频| 99久久久国产精品日本久久区一| 亚洲成人午夜免费在线观看| 国产高清av免费观看| 变态另类日韩欧美高清| 亚洲av天堂在线播放| 日本高清一区二区不卡视频| 91久久一区二区秋霞免费| 免费高清日本一区二区三区视频| 97资源视频在线播放| 国产龙熟女高潮一区二区| 蜜臀av人妻一区二区三区| 丰满人妻一区二区三区色| av天堂资源在线播放| 日韩一区二区三区无吗电影| 成人午夜福利影院在线| 久久久久久狠狠亚洲综合| 日韩爱爱特级视频中文字幕| 亚洲成人自拍视频在线观看| 亚洲福利网址一二三区| 国产精品久久久亚洲不卡| 色哟哟91精品色哟哟| 国产国产精品国产自在午夜| 男人天堂插插综合搜索| 国产在线观看91精品一区| 精品一区无遮挡免费网站| 欧美大尺度影片在线观看| 亚洲欧美日韩专区一区| 日韩三级成人在线视频| 99精品国产综合久久麻豆|