为了账号安全,请及时绑定邮箱和手机立即绑定

go中如何编写函数?

go中如何编写函数?

Go
德玛西亚99 2023-07-31 15:32:59
我正在尝试弄清楚如何设置中间件,现在我得到了类似的东西:func applyMiddleware(h *Handle) *Handle {    return a(b(c(h))) }有没有一种方法可以“组合”这些函数,以便我只需传递句柄列表即可返回组合函数?
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

使用切片

https://play.golang.org/p/DrEnGkIEbU3

package main


import (

    "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

    }

}


查看完整回答
反对 回复 2023-07-31
?
达令说

TA贡献1821条经验 获得超6个赞

自 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,其输出是最终结果:

https://img1.sycdn.imooc.com//64c763dd0001dcfc05710178.jpg

让我们首先定义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) *HandleapplyMiddleware


var applyMiddleware = composeAdapters(f, g, h)

再次注意组合顺序:

https://img1.sycdn.imooc.com//64c763ed0001d67407840178.jpg

查看完整回答
反对 回复 2023-07-31
  • 2 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信