使用回调和函数作为go中的类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用回调和函数作为go中的类型相关的知识,希望对你有一定的参考价值。

我试图创建一种类似于Go中的Express(NodeJS)路由方法的函数:

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

在这个例子中,我希望“foo”(类型)与上述方法中的匿名函数相同。这是我使用Go失败的尝试之一:

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
        )

我怎么能解决我的困境?我不应该使用类型并使用其他东西吗?我有什么选择?

答案

您处于正确的轨道 - 在您使用它的上下文中为func创建类型会增加更清晰的设计意图,更重要的是增加类型安全性。

您只需修改一下示例即可进行编译:

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
    )


另一答案
package main

import (
    "fmt"
    "log"
)

type foo func(string, string)

func bar(route string, callback foo) bool 
 //...logic

  /* you can return the callback to use the 
     parameters and also in the same way you 
     could verify the bar function
   */
    callback("param", "param")
    return true


func main() 
    fmt.Println("Hello, playground")

    res := bar("Hello", func(arg1, arg2 string) 
        log.Println(arg1 + "_1")
        log.Println(arg2 + "_2")
    )

    fmt.Println("bar func res: ", res)

以上是关于使用回调和函数作为go中的类型的主要内容,如果未能解决你的问题,请参考以下文章

Go函数

go语言入门四(复合类型 数组切片 指针)

go语言入门四(复合类型 数组切片 指针)

002_解析go语言中的回调函数

jQuery中的.animate()回调可以有阶梯函数和普通函数吗?

将 Go 函数作为回调传递给 C