Arbeiten mit der Funktion Arten in Go
Ich wollte eine Funktion von einem bestimmten Typ. Ich habe gefunden, einen Weg, es zu tun, aber es muss noch andere, sauberere und schönere Wege, die nicht mit var
. Was sind die alternativen Möglichkeiten, um die Funktion zu deklarieren english
Typ Greeting
?
package main
import "fmt"
type Greeting func(name string) string
func (g Greeting) exclamation(name string) string {
return g(name) + "!"
}
var english = Greeting(func(name string) string {
return "Hello, " + name
})
func main() {
fmt.Println(english("ANisus"))
fmt.Println(english.exclamation("ANisus"))
}
Im Beispiel oben, kann ich nicht Austausch var english = Greeting...
mit english := Greeting...
, noch kann ich entfernen Sie die Greeting(func ...)
und nur die func
stand alleine, da ich dann nicht in der Lage sein, um Zugriff auf die Ausrufezeichen Methode.
- Sie können nicht entfernen
var
weil Sie erklärenenglish
als eine Globale variable.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn er
var
ist Ihr Hauptproblem, drop können Sie es leicht ändern, ist=
in:=
wie diese:Aber Sie selbst haben nicht werfen Sie Ihre Funktion in
Greeting
. Die spec sagt über Funktion Typen:Und diese über Typ-Identität:
Dies bedeutet, dass jede Funktion eine eigene Funktion geben. Wenn zwei Funktionen haben die gleiche Signatur (parameter-und Ergebnistypen), Sie teilen sich eine Funktion geben. Durch das schreiben
type Greeting func...
sind Sie nur geben Sie einen Namen, um eine bestimmte Funktion geben, die nicht der Definition einer neuen.Also der folgende code funktioniert, und ich hoffe, dass zeigt den richtigen Weg, um die Arbeit mit Funktionstypen in Go:
Bemerken, daß ich auch gelöscht Semikolon und Klammer von Ihrer
english
Funktion. Gehen die Entwickler nicht verwenden, diese Interpunktion, wenn Sie nicht haben, um.UPDATE: Jetzt, dass Sie haben ein Beispiel-code kann ich klar verstehen, das problem.
Zu diesem Zweck Ihr code ist gut genug, und es gibt nicht viel andere Möglichkeiten, es zu tun. Wenn Sie mögen, können Sie werfen nur vor dem Aufruf der Methode:
Aber ich bin mir nicht sicher, ob dies eine Verbesserung. Ich sage nur, dass für das, was Sie tun möchten, scheint es nicht zu sein, andere Möglichkeiten den code zu schreiben.
Ist, wenn wir nicht wollen, ändern Ihre Arten. Ich meine, die ganze Idee für den Aufruf einer Methode auf eine Funktion Typ scheint ein wenig seltsam. Nicht, dass es falsch ist, aber ein wenig seltener. Ein anderer Weg, um die gleiche Wirkung in einer üblichen Weise durch einen struct-Typ und ein Feld für die Funktion. So etwas wie dieses:
Hier
english
undfrench
zeigen zwei unterschiedliche Arten der Kodierung die gleiche Sache. Nochmal, ich sage nicht, dass dies die bessere Lösung ist, aber üblich und flexibler Weg zur Erreichung der gleichen Wirkung.func english(...)
undGreeting(func english(...))
anders sein wird. Man darf nicht auf geben Methode, während die anderen kann. Also, ich glaube, der erste Titel war korrekt.websocket.Handler
eine Funktion geben mit der MethodeServeHTTP(w http.ResponseWriter, req *http.Request)
(Umsetzung derhttp.Handler
- Schnittstelle). Nochmals vielen Dank!Greeting
wenn Sie wollen, rufen Sie die Methodeexclaimation
. sonst wird es nicht funktionieren, play.golang.org/p/LJ8iVG6-gZVersucht, eigene Probleme hier,
Ist der Weg, um die Funktion zu deklarieren Englisch vom Typ Gruß. Hinweis Gruß ist nicht in der definition von Deutsch, so kann dies nicht Ihre Bedingung erfüllen, deklarieren eine Funktion von einem bestimmten Typ. Ansonsten, sorry, es gibt keine Möglichkeit in der Go zu definieren eine Funktion einer bestimmten (wird separat definiert) geben. Es wäre schön, etwas zu geben wie,
aber Nein, es gibt keinen Weg im Gehen. Die Erklärung des englischen nicht verwenden kann Gruß, und muss wiederholen Sie die Funktion Unterschrift. Statt der Anforderung, dass Englisch von Art Gruß ist nur in der Zuordnung
g deklariert ist vom Typ Gruß. Wenn Englisch nicht die gleiche Art, die Linie wird nicht kompiliert.
Über die Frage zu wiederholen, die Art der Signatur--die Fragen der Methoden, zum Beispiel-es ist nicht klar, wenn Sie noch auf der Suche nach anderen Möglichkeiten, sich zu organisieren, die die Funktionalität von Ihrem Beispiel. Es kann sicherlich getan werden, andere Möglichkeiten. Ein größeres Beispiel obwohl, vielleicht früher als eine separate Frage, würde helfen.
english := Greeting { ... }
line, wo Sie erklärte, dass es keine solche Möglichkeit. Aber Sie haben mich zu verstehen weiter so arbeiten Sie mit der Funktion Typen in einem Gehen idiomatischer Weg.