J'appelle une fonction qui renvoie une paire (dans l'exemple Os.Open) et je veux transmettre la paire renvoyée directement comme argument à une autre fonction (sans utiliser de variables intermédiaires). J'ai essayé les deux manières suivantes, sans succès.
D'autres langues (comme F #) permettent d'effectuer une correspondance de modèle sur l'appel de la fonction. Comment puis-je obtenir la même chose dans Go? func checkError((f *os.File, e error), m string) interface{} { //ERROR
if e != nil { /*Print m and panic*/}
return f
}
func f1(path string) {
checkError(os.Open(path), "Can't Open File")
}
3 Réponses :
Permettre cela entraînerait un comportement ambigu; Mais vous pouvez fermer sur le dernier argument et renvoyer une fonction partiellement appliquée:
func checkError(f *os.File, e error) func(string) {
return func(m string) {
if e != nil {
// do stuff with m
}
}
checkError(os.Open(path))("Can't Open File")
Merci à Jack Itin, je me suis souvenu que les fonctions peuvent également être retournées.
La solution suivante fonctionne pour moi
Je trouve cela un peu incompatible car ce qui suit fonctionne bien, mais lorsque l'argument de positionnement supplémentaire est ajouté, le compilateur ne l'aime pas.
type OsFunction func(string)(* os.File, error)
func checkError(osFunction OsFunction, path string, m string) interface{} {
f, e := osFunction(path)
if e != nil {
/*Print m and panic*/
}
return f
}
func f2(path string) {
checkError2(os.Open, path, "Can't Open File")
}
Vous ne pouvez pas, allez ne pas avoir une telle syntaxe.
Ce n'est pas vraiment clair ce que
CheckError code> est censé faire. Il est défini à l'aide de la syntaxe non valide. L'intention n'est donc pas claire. Est-il destiné à prendre une fonction comme premier argument? Ou est-il destiné à prendre la sortie d'une fonction comme ses deux premiers arguments?Ce que vous essayez de faire est plus typique d'une langue fonctionnelle. Go Docs recommander de "ne pas essayer d'être trop intelligent"
Vous ne pouvez pas et c'est bon. Considérez:
Func One () INT; func deux () (int, int); amusement f (a, b, c int); code> Vous pouvez désormais appeler les deux manières:f (un (), deux ()) code> etf (deux (), un ()) code> sans indice de compilateur. Aller essaie d'interdire tout ce qui pourrait potentiellement conduire à des erreurs.