golangのタイプfunc()の使用分析

golangのhttpサービス部分のコードを見ると、golangのfunc()型に戸惑い、しばらくコードがわかりませんでした。情報を確認したところ、少しわかりました。
golangでは、httpサービスは次のように簡単に実装できます。

package main

import "net/http"

func mHttp() {
    http.HandleFunc("/", h)
    http.ListenAndServe("0.0.0.0:8888",nil)
}
func h(w http.ResponseWriter, r *http.Request) {

}

http.HandleFunc()これは、文字列型のルートを渡す登録関数であり、関数であり、関数のパラメーターは(http.ResponseWriter、* http.Request)です。golangソースコードnet / http /server.goファイルのトラックエントリ機能

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

HandleFuncで呼び出さますDefaultServeMux.HandleFunc(pattern, handler)
これらの関数の目的については、説明しません。これは、この記事の焦点では​​ありません。
機能を再度フォローアップする

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

どのような地獄はある二番目のパラメータmux.Handle(パターン、HandlerFunc(ハンドラ)) HandlerFunc(handler)
ファローアップ

type HandlerFunc func(ResponseWriter, *Request)

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

その判明HandlerFuncがある定義された関数によってタイプ、および機能のタイプは、元々渡されたタイプである。func(ResponseWriter, *Request)
ServeHTTPがある方法HandlerFunc(golang方法および機能は同じものではないことに注意してください)。また、HandlerFuncは、ハンドラーインターフェイス
ハンドラーインターフェイス定義を実装します。

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

HandleFuncメソッドに戻ると、mux.Handle(pattern, HandlerFunc(handler))2番目のパラメーターは、渡された関数ハンドラーHandlerFunc型に強制して、ハンドラーがHandlerインターフェースを実装するようにすることです。
この時点で、HandlerFunc(handler)通常の関数を型定義関数に強制することであることわかります。
次に、簡単なデモを作成して確認します。

package main

import "fmt"

func main() {
   one(2, callback)
}

//需要传递函数
func callback(i int) {
   fmt.Println("i am callBack")
   fmt.Println(i)
}

//main中调用的函数
func one(i int, f func(int)) {
   two(i, fun(f))
}

//one()中调用的函数
func two(i int, c Call) {
   c.call(i)
}

//定义的type函数
type fun func(int)

//fun实现的Call接口的call()函数
func (f fun) call(i int) {
   f(i)
}

//接口
type Call interface {
   call(int)
}

プログラムの結果を最初に見てください:


私たちは、と呼ばれる1()関数のmain()関数を渡され、コールバック()関数を、最後に呼ばれるコールバック()関数で、我々は、渡されたし

 

考えてみてください。

使用するタイプ定義機能するFUNC(int)を
定義するコール機能があります。インターフェースをコール(int型)
呼び出すコール(コールバック、2)1のの主は)(呼び出し)(2つ1() およびに渡します。2つ()関数は、以前は、型変換は、通常の機能のタイプによって定義された関数に、コールバック関数のために実施されました。cCallインターフェイスを実装しているため、着信ctwo()で呼び出します。これにより、call()関数を呼び出し、最後に、渡したcallback()関数呼び出すことができます

おすすめ

転載: blog.csdn.net/qq_32907195/article/details/112189207