第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

恐慌:最后一個(gè)參數(shù)需要是 http.HandlerFunc 類(lèi)型

恐慌:最后一個(gè)參數(shù)需要是 http.HandlerFunc 類(lèi)型

Go
藍(lán)山帝景 2023-05-22 15:36:47
我有這個(gè)輔助函數(shù),可以正常編譯:func Middleware(adapters ...interface{}) http.HandlerFunc {    log.Info("length of adapters:", len(adapters))    if len(adapters) < 1 {        panic("Adapters need to have length > 0.");    }    h, ok := (adapters[len(adapters)-1]).(http.HandlerFunc)    if ok == false {        panic("Last argument needs to be of type http.HandlerFunc") // ERROR HERE    }    adapters = adapters[:len(adapters)-1]    for _, adapt := range adapters {        h = (adapt.(AdapterFunc))(h)    }    return h}我這樣稱(chēng)呼它:router.HandleFunc("/share", h.makeGetMany(v)).Methods("GET")func (h Handler) makeGetMany(v Injection) http.HandlerFunc {    return mw.Middleware(        mw.Allow("admin"),        func(w http.ResponseWriter, r *http.Request) {            log.Println("now we are sending response.");            json.NewEncoder(w).Encode(v.Share)        },    )}問(wèn)題是我收到此錯(cuò)誤,但我無(wú)法弄清楚原因:    panic: Last argument needs to be of type http.HandlerFunc    goroutine 1 [running]:    huru/mw.Middleware(0xc420083d40, 0x2, 0x2, 0xc42011f3c0)            /home/oleg/codes/huru/api/src/huru/mw/middleware.go:301 +0x187    huru/routes/share.Handler.makeGetMany(0xc4200ae1e0, 0x10)            /home/oleg/codes/huru/api/src/huru/routes/share/share.go:62 +0x108它確實(shí)確認(rèn)適配器切片的長(zhǎng)度為 2: length of adapters:2有誰(shuí)知道為什么在這種情況下該類(lèi)型斷言會(huì)失???沒(méi)有意義。也許我實(shí)際上并沒(méi)有檢索切片的最后一個(gè)參數(shù)之類(lèi)的?有沒(méi)有更好的方法從切片中彈出最后一個(gè)參數(shù)?
查看完整描述

2 回答

?
函數(shù)式編程

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊

您需要使用 .將mw.Middleware()語(yǔ)句的第二個(gè)參數(shù)包裝到類(lèi)型中。http.Handlerhttp.HandlerFunc()


func (h Handler) makeGetMany(v Injection) http.HandlerFunc {

    return mw.Middleware(

        mw.Allow("admin"),

        http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

            log.Println("now we are sending response.");

            json.NewEncoder(w).Encode(v.Share)

        }),

    )

}


查看完整回答
反對(duì) 回復(fù) 2023-05-22
?
catspeake

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個(gè)贊

在 http 包中,?ListenAndServe具有以下簽名

func?ListenAndServe(addr?string,?handler?Handler)?error

其中Handler(ie,?http.Handler) 是一個(gè)接口

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

對(duì)于一個(gè) Web 應(yīng)用程序,只有一個(gè)ListenAndServe調(diào)用,因此只有一個(gè)handler,它需要處理所有訪問(wèn)點(diǎn),例如/url1,/url2等。如果我們從頭開(kāi)始編寫(xiě)handler,實(shí)現(xiàn)可能是struct一個(gè)圍繞數(shù)據(jù)庫(kù)句柄的自定義。它的ServeHTTP方法是檢查訪問(wèn)點(diǎn),然后把相應(yīng)的內(nèi)容寫(xiě)入到ResponseWriter,比較繁瑣和雜亂。

這就是ServeMux的動(dòng)機(jī),它router在您的代碼中。它有一個(gè)ServeHTTP方法,因此它滿(mǎn)足http.Handler接口并可用于ListenAndServe.?此外,它還有HandleFunc處理個(gè)別接入點(diǎn)的方法

func?(mux?*ServeMux)?HandleFunc(pattern?string,
????????????????????????????????handler?func(ResponseWriter,?*Request))

注意這里handler不是 a?http.Handler,即它沒(méi)有ServeHTTP方法。它不必這樣做,因?yàn)樗?code>mux已經(jīng)擁有ServeHTTP并且它的ServeHTTP方法可以將各個(gè)訪問(wèn)點(diǎn)請(qǐng)求分派給相應(yīng)的處理程序。

請(qǐng)注意,它還有一個(gè)Handle方法,該方法需要參數(shù)滿(mǎn)足http.Handler接口。與方法相比,使用起來(lái)稍微不方便HandleFunc。

func?(mux?*ServeMux)?Handle(pattern?string,?handler?Handler)

現(xiàn)在回到你的問(wèn)題,因?yàn)槟愦螂娫?code>router.HandleFunc,它的輸入不一定是http.Handler。因此,另一種解決方案是用作func(ResponseWriter, *Request)中間件和makeGetMany方法的返回類(lèi)型。(中間件中的類(lèi)型斷言也需要更新,可能還需要更新更多代碼)

@xpare 的解決方案是進(jìn)行類(lèi)型轉(zhuǎn)換,以便所有函數(shù)簽名匹配,即轉(zhuǎn)換func(ResponseWriter, *Request)http.HandlerFunc.?看看它是如何工作的也很有趣。

// The HandlerFunc type is an adapter to allow the use of

// ordinary functions as HTTP handlers. If f is a function

// with the appropriate signature, HandlerFunc(f) is a

// Handler that calls f.

type HandlerFunc func(ResponseWriter, *Request)


// ServeHTTP calls f(w, r).

func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {

? ? f(w, r)

}

你可以看到它基本上定義了一個(gè)ServeHTTP調(diào)用自身的方法。


查看完整回答
反對(duì) 回復(fù) 2023-05-22
  • 2 回答
  • 0 關(guān)注
  • 165 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)