2016-06-13 5 views
1

メイン関数では、ゴリラmuxルータとそのルートを処理する関数があります。golangの場合、net/httpを使用すると、後ろにかっこが付いていても機能が呼び出されません。

var router = mux.NewRouter() 
func main() { 
    router.HandleFunc("/", ParseSlash) 
    http.Handle("/", router) 
    http.ListenAndServe(":8000", nil) 
} 

とParseSlashは

const slash = `<h1>Login</h1> 
<form method="post" action="/login"> 
    <label for="name">User name</label> 
    <input type="text" id="name" name="name"> 
    <label for="password">Password</label> 
    <input type="password" id="password" name="password"> 
    <button type="submit">Login</button> 
</form>` 

func ParseSlash(response http.ResponseWriter, request *http.Request) { 
    fmt.Fprintf(response, slash) 
} 

のように見えますが、メインでは、我々はParseSlash()として関数を呼び出すされていませんが、router.HandleFunc()内部ParseSlash。明示的に提供していない場合、関数はどこからパラメータを取得しますか?この関数を呼び出す方法は何ですか?

ありがとうございます。

答えて

8

メインから関数を呼び出すのではなく、HandleFuncの引数として提供し、mux.Routerのパス "/"に呼び出されるように登録します。後に呼び出される関数を提供するこのパターンは、通常、「コールバック」として知られています。

あなたParseSlash関数が示す引数を渡す、(mux.Routerを経て、ここに)あなたの関数は、最終的にそのServeHTTP方法を経由してhttp.Serverによって呼び出されるタイプhttp.HandlerFunc

type HandlerFunc func(ResponseWriter, *Request) 

です。関数が呼び出されると、http.ResponseWriter*http.Request引数は、処理されている個々のhttp要求用です。

+4

さらに、「ブラケットなしの関数」という名前はコールバックと呼ばれ、一般的な手法であり、オンラインで多くのリソースを見つけることができます。それは非常に一般的です(そして、不可欠です)。 JavaScript。 – tsdtsdtsd

2

単純なコールバックです。あなたは将来的にいくつかの機能を呼び出すときにそれを必要としますが、今ではそれを実行するのに十分な情報がありません。 Look - http.ListenAndServeはサーバーを作成し、クライアントを待機します。

関数ParseSlashを呼び出すことはできません。クライアントが接続してアドレス「/」を送信した後は意味をなさないためです。それが起こったとき、ルータはあなたのコードを引数http.ResponseWriterと* http.Requestで呼び出すのに十分な情報を持っていました。

これで、クロージャの働きを理解する必要があります。https://tour.golang.org/moretypes/25。そして、httpサーバhttps://www.nicolasmerouze.com/middlewares-golang-best-practices-examples/に戻りましょう。

関連する問題