go中如何编写函数?

我正在尝试弄清楚如何设置中间件,现在我得到了类似的东西:

func applyMiddleware(h *Handle) *Handle {
   return a(b(c(h)))
}

有没有一种方法可以“组合”这些函数,以便我只需传递句柄列表即可返回组合函数?


德玛西亚99
浏览 129回答 2
2回答

慕侠2389804

使用切片https://play.golang.org/p/DrEnGkIEbU3package mainimport (    "fmt")func main() {    fmt.Println(v(v(v(0))))    fmt.Println(compose(v, v, v)(0))}func v(i int) int {    return i + 1}func compose(manyv ...func(int) int) func(int) int {    return func(i int) int {        for _, v := range manyv {            i = v(i)        }        return i    }}

达令说

自 Go 1.18 引入泛型以来,您可以定义以下泛型函数来组合两个任意函数:func compose[A any, B any, C any](f func(A) B, g func(B) C) func(A) C {    return func(a A) C {        return g(f(a))    }}上面的组合顺序compose是从左到右,即compose(f, g)返回函数“ f后的g ”或g∘f,相当于Haskell中的以及F#或Elm中的to 。g . ff >> g换句话说,结果函数的输入 – compose(f, g)– 被馈送到f,然后f的输出被馈送到g,其输出是最终结果:让我们首先定义Adapter用于表示要编写的函数类型的类型:type Adapter = func(*Handle) *Handle使用composeand Adapter,您现在可以定义composeAdapters组合任意数量的这些Adapter函数:func composeAdapters(adapters ...Adapter) Adapter {    composition := func(h *Handle) *Handle {        return h    }    for _, adapter := range adapters {        composition = compose(composition, adapter)    }    return composition}请注意 被composition初始化为 的恒等函数*Handle。您可以将其视为无操作适配器:它只是将生成的组合适配器的输入转发到链中要组合的第一个函数(如果有)。这也意味着composeAdapters不带任何参数的调用(例如,composeAdapters())会导致无操作适配器:它对输入不执行任何操作*Handle;它只是将其返回。给定类型的函数f、g和–即–可以实现为:hAdapterfunc(*Handle) *HandleapplyMiddlewarevar applyMiddleware = composeAdapters(f, g, h)再次注意组合顺序:
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go