2017-12-27 5 views
-1

Ich bin neu in der Sprache und funktionale Programmierung.Anonyme Funktionen in Golang

Meine Frage ist: aber können Sie die Vorteile von anonymen Funktionen in Golang aufzählen. Ich verstehe aus dieser site, dass anonyme Funktionen "Segmente Code sind, die nur einmal ausgeführt werden müssen und nicht referenziert werden müssen." aber ich kann den Nutzen von ihnen nicht finden.

+0

'Ich bin neu in der Sprache und funktionale Programmierung. - Go ist keine funktionale Sprache. – Flimzy

+0

"die Vorteile aufzählen" ist sowohl zu breit als auch auf der Grundlage von Meinungen. Versuchen Sie eine Websuche nach * verwendet für anonyme Funktionen * oder etwas. – Adrian

+0

Ich habe nie gesagt, dass go eine funktionale Sprache ist. Ich sagte nur, ich bin neu in der Idee der funktionalen Programmierung und Go. –

Antwort

3

Ein Funktionsliteral stellt eine anonyme Funktion dar. Die specification mentions the primary benefit of function literals:

Funktionsliterale sind Schließungen: Sie können sich auf Variablen beziehen, die in einer umgebenden Funktion definiert sind. Diese Variablen werden dann zwischen der umgebenden Funktion und dem Funktionsliteral geteilt, und sie bleiben bestehen, solange sie zugänglich sind.

Hier einige Beispiele verwendet anonyme Funktionen: sort.Slice, http mux.HandleFunc, panic recovery, goroutines, filepath.Walk, ast.Inspect.

+0

Auch ['filepath.WalkFunc'] (https://golang.org/pkg/path/filepath/#WalkFunc). – maerics

0

Die spezifische Anwendungsfall für Funktionsliteralen, die nicht sofort in einer Variablen und ausgeführt gespeichert werden, wird eine neue Funktion Umfang zu schaffen laufen defer in.

Als Beispiel, wenn Sie verwenden sync.Mutex (die in vielen Fälle sollten durch Kanäle ersetzt werden, aber das ist ein anderes Thema) Sie können einen Codeabschnitt, der einen bestimmten Mutex benötigt, festhalten und dennoch das entsperrte Entsperren verwenden, ohne den Mutex während des gesamten Funktionslaufs gesperrt zu lassen.

Sie können die anonyme Funktion auch verschieben, wenn Sie sie nicht sofort ausführen möchten. Dies wird häufig mit recover verwendet, um Panics innerhalb des Funktionsaufrufs zu behandeln.

1

Ein Beispiel aus der Go documentation for net/http.

Hier ist ein einfacher Web-Server den Pfad Umgang /hello:

package main 

import (
    "io" 
    "net/http" 
    "log" 
) 

// hello world, the web server 
func HelloServer(w http.ResponseWriter, req *http.Request) { 
    io.WriteString(w, "hello, world!\n") 
} 

func main() { 
    http.HandleFunc("/hello", HelloServer) 
    log.Fatal(http.ListenAndServe(":12345", nil)) 
} 

Bemerken Sie, dass die Funktion HelloServer definiert ist nur auf den Aufruf zu http.HandleFunc in der ersten Zeile von main weitergegeben werden? eine anonyme Funktion mit diesem stattdessen geschrieben werden könnte:

package main 

import (
    "io" 
    "net/http" 
    "log" 
) 

func main() { 
    http.HandleFunc("/hello", func (w http.ResponseWriter, req *http.Request) { 
    io.WriteString(w, "hello, world!\n") 
    }) 

    log.Fatal(http.ListenAndServe(":12345", nil)) 
} 

Wenn eine Funktion braucht nur an einer Stelle verwendet werden soll, könnte es eine gute Idee sein, eine anonyme Funktion zu nutzen, vor allem, wenn sein Körper klein ist.

+0

Vielen Dank für die Antwort, aber es wäre besser, kleinere Funktionen zu verwenden, weil: 1. Sie sind selbstdokumentierend 2. Sie sind Unit-Testable. –