我想在go函数中将函数作为参数传递。这是我的代码:
func Call(path string, method func()) {
// TODO launch the method here
}
当我想调用此函数时,我想这样做:
func routes() {
app.Call("/", controllers.Index())
}
Index()
方法是:
func Index(res http.ResponseWriter, req http.Request) {
userAgent := req.Header.Get("User-Agent")
fmt.Fprintf(res, "You're User-Agent is %s", userAgent)
}
创建一个type
并将此type
作为参数传递是一个好主意吗?
答案 0 :(得分:2)
创建命名类型完全取决于您。从技术上讲,即使您在签名中匿名进行类型化,您也要定义一个类型(代码中的类型为func()
)。是否需要使用名称来定义它取决于您,并取决于您的用例和需求。
无论是否定义命名类型,函数签名都必须匹配(您不能将func(http.ResponseWriter, http.Request)
传递给func()
参数),并且必须传递函数而不是调用它并传递其返回值(没有返回值):
// Correct arguments required
func Call(path string, method func(http.ResponseWriter, http.Request)) {
// TODO launch the method here
}
func routes() {
// Index() calls the function, you just want to pass a reference to it
app.Call("/", controllers.Index)
}