欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go之接口型函數(shù)用法

 更新時(shí)間:2023年02月10日 08:54:21   作者:Generalzy  
這篇文章主要介紹了Go之接口型函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在net/http包中,有一個(gè)接口型函數(shù)的實(shí)現(xiàn):

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

// 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)
}

為什么在多路復(fù)用器中不能直接根據(jù)路由取到視圖函數(shù)HandlerFunc然后加括號(hào)執(zhí)行呢?

反而還要多此一舉實(shí)現(xiàn)Handler接口,然后將函數(shù)包裝后HandlerFunc(f).ServeHTTP(w,r)調(diào)用呢。

價(jià)值

既能夠?qū)⑵胀ǖ暮瘮?shù)類型(需類型轉(zhuǎn)換)作為參數(shù),也可以將結(jié)構(gòu)體作為參數(shù),使用更為靈活,可讀性也更好,這就是接口型函數(shù)的價(jià)值。

實(shí)例1(net/http)

可以 http.Handle 來映射請(qǐng)求路徑和處理函數(shù),Handle 的定義如下:

func Handle(pattern string, handler Handler)

第二個(gè)參數(shù)是即接口類型 Handler,

func home(w http.ResponseWriter, r *http.Request) {
?? ?w.WriteHeader(http.StatusOK)
?? ?_, _ = w.Write([]byte("hello, index page"))
}

func main() {
?? ?http.Handle("/home", http.HandlerFunc(home))
?? ?// http.HandlerFunc(home)->HandlerFunc->默認(rèn)的多路復(fù)用器會(huì)調(diào)用它的ServeHTTP()方法
?? ?_ = http.ListenAndServe("localhost:8000", nil)
}

另外一個(gè)函數(shù) http.HandleFunc,HandleFunc 的定義如下:

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

第二個(gè)參數(shù)是一個(gè)普通的函數(shù)類型,

func main() {
?? ?http.HandleFunc("/home", home)
?? ?_ = http.ListenAndServe("localhost:8000", nil)
}

兩種寫法是完全等價(jià)的,HandleFunc內(nèi)部將第二種寫法轉(zhuǎn)換為了第一種寫法。

func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
?? ?if handler == nil {
?? ??? ?panic("http: nil handler")
?? ?}
?? ?mux.Handle(pattern, HandlerFunc(handler))
}

http.ListenAndServe 的第二個(gè)參數(shù)也是接口類型 Handler,使用了標(biāo)準(zhǔn)庫(kù) net/http 內(nèi)置的路由,因此傳入的值是 nil。

如果這個(gè)地方傳入的是一個(gè)實(shí)現(xiàn)了 Handler 接口的結(jié)構(gòu)體,就可以完全托管所有的 HTTP 請(qǐng)求,后續(xù)怎么路由,怎么處理,請(qǐng)求前后增加什么功能,都可以自定義了。慢慢地,就變成了一個(gè)功能豐富的 Web 框架了。

實(shí)例2(tutu)

// A Getter loads data for a key.
type Getter interface {
?? ?Get(key string) ([]byte, error)
}

// A GetterFunc implements Getter with a function.
type GetterFunc func(key string) ([]byte, error)

// Get implements Getter interface function
func (f GetterFunc) Get(key string) ([]byte, error) {
?? ?return f(key)
}

假設(shè)有一個(gè)方法:

func GetData(getter Getter, key string) []byte {
?? ?buf, err := getter.Get(key)
?? ?if err == nil {
?? ??? ?return buf
?? ?}
?? ?return nil
}

如何給該方法傳參呢?

方式一:GetterFunc 類型的函數(shù)作為參數(shù)(匿名函數(shù))

GetData(GetterFunc(func(key string) ([]byte, error) {
?? ?return []byte(key), nil
}), "hello")

方式二:普通函數(shù)

func test(key string) ([]byte, error) {
?? ?return []byte(key), nil
}

func main() {
? ? GetData(GetterFunc(test), "hello")
}

將 test 強(qiáng)制類型轉(zhuǎn)換為 GetterFunc,GetterFunc 實(shí)現(xiàn)了接口 Getter,是一個(gè)合法參數(shù)。這種方式適用于邏輯較為簡(jiǎn)單的場(chǎng)景。

方式三:實(shí)現(xiàn)了 Getter 接口的結(jié)構(gòu)體作為參數(shù)

type DB struct{ url string}

func (db *DB) Query(sql string, args ...string) string {
?? ?// ...
?? ?return "hello"
}

func (db *DB) Get(key string) ([]byte, error) {
?? ?// ...
?? ?v := db.Query("SELECT NAME FROM TABLE WHEN NAME= ?", key)
?? ?return []byte(v), nil
}

func main() {
?? ?GetData(new(DB), "hello")
}

DB 實(shí)現(xiàn)了接口 Getter,也是一個(gè)合法參數(shù)。這種方式適用于邏輯較為復(fù)雜的場(chǎng)景,如果對(duì)數(shù)據(jù)庫(kù)的操作需要很多信息,地址、用戶名、密碼,還有很多中間狀態(tài)需要保持,比如超時(shí)、重連、加鎖等等。這種情況下,更適合封裝為一個(gè)結(jié)構(gòu)體作為參數(shù)。

這樣,既能夠?qū)⑵胀ǖ暮瘮?shù)類型(需類型轉(zhuǎn)換)作為參數(shù),也可以將結(jié)構(gòu)體作為參數(shù),使用更為靈活,可讀性也更好,這就是接口型函數(shù)的價(jià)值。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Golang通脈之流程控制詳情

    Golang通脈之流程控制詳情

    這篇文章主要介紹了Golang通脈之流程控制,流程控制是每種編程語言控制邏輯走向和執(zhí)行次序的重要部分,Go語言中最常用的流程控制有if和for,而switch和goto主要是為了簡(jiǎn)化代碼,下面文章將詳細(xì)介紹改該內(nèi)容,需要的朋友可以參考一下
    2021-10-10
  • Go 實(shí)現(xiàn)熱重啟的詳細(xì)介紹

    Go 實(shí)現(xiàn)熱重啟的詳細(xì)介紹

    這篇文章主要介紹了Go 實(shí)現(xiàn)熱重啟的詳細(xì)介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 詳解Go語言如何利用上下文進(jìn)行并發(fā)計(jì)算

    詳解Go語言如何利用上下文進(jìn)行并發(fā)計(jì)算

    在Go編程中,上下文(context)是一個(gè)非常重要的概念,它包含了與請(qǐng)求相關(guān)的信息,本文主要來和大家討論一下如何在并發(fā)計(jì)算中使用上下文,感興趣的可以了解下
    2024-02-02
  • VsCode搭建Go語言開發(fā)環(huán)境的配置教程

    VsCode搭建Go語言開發(fā)環(huán)境的配置教程

    這篇文章主要介紹了在VsCode中搭建Go開發(fā)環(huán)境的配置教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • GoLang RabbitMQ TTL與死信隊(duì)列以及延遲隊(duì)列詳細(xì)講解

    GoLang RabbitMQ TTL與死信隊(duì)列以及延遲隊(duì)列詳細(xì)講解

    這篇文章主要介紹了GoLang RabbitMQ TTL與死信隊(duì)列以及延遲隊(duì)列,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • go語言切片slice使用細(xì)節(jié)和注意事項(xiàng)整理大全

    go語言切片slice使用細(xì)節(jié)和注意事項(xiàng)整理大全

    這篇文章主要給大家介紹了關(guān)于go語言切片slice使用細(xì)節(jié)和注意事項(xiàng)整理的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • Golang初始化MySQL數(shù)據(jù)庫(kù)方法淺析

    Golang初始化MySQL數(shù)據(jù)庫(kù)方法淺析

    這篇文章主要介紹了Golang初始化MySQL數(shù)據(jù)庫(kù)的方法,數(shù)據(jù)庫(kù)的建立第一步即要初始化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-05-05
  • graphql---go http請(qǐng)求使用詳解

    graphql---go http請(qǐng)求使用詳解

    這篇文章主要介紹了graphql---go http請(qǐng)求使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • go?defer?return?panic?執(zhí)行順序示例詳解

    go?defer?return?panic?執(zhí)行順序示例詳解

    這篇文章主要介紹了go?defer?return?panic?執(zhí)行順序,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Go語言輕量級(jí)高性能嵌入式規(guī)則引擎RuleGo使用詳解

    Go語言輕量級(jí)高性能嵌入式規(guī)則引擎RuleGo使用詳解

    這篇文章主要為大家介紹了Go語言輕量級(jí)高性能嵌入式規(guī)則引擎RuleGo使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評(píng)論