2016-10-04 2 views
1

Ich bin versucht, eine Art von Funktion zu erstellen, die die Express (NodeJS) Route Methode in Go ähnlich ist: In diesem Beispiel mag ich „foo“Rückrufe und Funktionen als eine Art in go Mit

app.get("route/here/", func(req, res){ 
    res.DoStuff() 
});  

(der Typ) ist identisch mit der anonymen Funktion in der obigen Methode. Hier ist eine meiner gescheiterten Versuche gehen mit:

type foo func(string, string) 

func bar(route string, io foo) { 
     log.Printf("I am inside of bar") 
     // run io, maybe io() or io(param, param)? 
} 

func main() { 
     bar("Hello", func(arg1, arg2) { 
       return arg + arg2 
     }) 
} 

Wie könnte ich mein Dilemma lösen? Sollte ich einen Typ nicht verwenden und etwas anderes verwenden? Was sind meine Möglichkeiten?

+0

Randnotiz, aber wahrscheinlich in Verbindung stehend - In Bezug auf die kühlen Frameworks Go Web, das eine Middleware-Muster mit einer allgemeinen Syntax verwenden, die vertraut sind Express ist https://echo.labstack.com. – syllabix

+0

@syllabix Ich versuche eine Kopie von Echo zu erstellen :) – adamSiwiec

Antwort

6

Sie sind auf dem richtigen Weg - Erstellen eines Typs für eine Funktion auf den Kontext, den Sie verwenden, fügt klarere Designabsicht und vor allem zusätzliche Typ Sicherheit.

Sie müssen nur Sie zB etwas zu ändern, um es zu kompilieren:

package main 

import "log" 

//the return type of the func is part of its overall type definition - specify string as it's return type to comply with example you have above 
type foo func(string, string) string 

func bar(route string, io foo) { 

    log.Printf("I am inside of bar") 
    response := io("param", "param") 
    log.Println(response) 

} 

func main() { 

    bar("Hello", func(arg1, arg2 string) string { 
     return arg1 + arg2 
    }) 

}