亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號