2016-06-13 2 views
1

In der Hauptfunktion habe ich einen Gorilla Mux Router und eine Funktion, um die Route zu behandeln.In Golang funktioniert das Aufrufen einer Funktion mit und ohne nachfolgende Klammern bei der Verwendung von net/http

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

und ParseSlash sieht aus wie

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

jedoch in Haupt, wir sind nicht die Funktion als ParseSlash(), aber ParseSlash innerhalb router.HandleFunc() aufrufen. Woher bezieht die Funktion die Parameter, wenn wir nicht explizit angeben? Wie nennt man so eine Funktion?

Vielen Dank.

Antwort

8

Sie rufen die Funktion nicht von main an, Sie stellen sie als Argument für HandleFunc bereit und registrieren sie für den Pfad "/" in der mux.Router. Dieses Muster zum Bereitstellen einer Funktion, die später aufgerufen werden soll, wird typischerweise als "Rückruf" bezeichnet.

Ihre ParseSlash Funktion ist vom Typ http.HandlerFunc

type HandlerFunc func(ResponseWriter, *Request) 

Ihre Funktion schließlich von der http.Server über seine ServeHTTP Methode (hier über die mux.Router), vorbei an den gezeigten Argumente genannt wird. Wenn die Funktion aufgerufen wird, werden die Argumente http.ResponseWriter und *http.Request für die Verarbeitung der einzelnen http-Anforderungen verwendet.

+4

Darüber hinaus wird die "Funktion ohne Klammern", wie Sie es genannt haben, ein Callback genannt und ist eine gängige Technik, für die Sie viele Ressourcen online finden können. Es ist sehr üblich (und imho wesentlich) in z.B. JavaScript. – tsdtsdtsd

2

Es ist ein einfacher Rückruf. Sie brauchen das, wenn Sie in der Zukunft eine Funktion aufrufen möchten, aber jetzt haben Sie nicht genug Informationen, um das zu tun. Look - http.ListenAndServe erstellt einen Server und wartet auf den Client.

Sie können die Funktion ParseSlash nicht aufrufen, weil es sinnvoll ist, nachdem der Client eine Verbindung herstellt und die Adresse "/" sendet. Wenn es passiert ist, hätte der Router genügend Informationen, um den Code mit den Argumenten http.ResponseWriter und * http.Request zurückzurufen.

Jetzt sollten Sie lernen, wie Verschlüsse funktioniert - https://tour.golang.org/moretypes/25. Und Sie werden getan, lassen Sie uns zurück zu HTTP-Server https://www.nicolasmerouze.com/middlewares-golang-best-practices-examples/.