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つ()関数は、以前は、型変換は、通常の機能のタイプによって定義された関数に、コールバック関数のために実施されました。cはCallインターフェイスを実装しているため、着信cをtwo()で呼び出します。これにより、call()関数を呼び出し、最後に、渡したcallback()関数を呼び出すことができます。