在go函数中将函数作为参数传递

时间:2018-10-25 13:02:45

标签: function go

我想在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作为参数传递是一个好主意吗?

1 个答案:

答案 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)
}