第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在 Go 中泛化函數(shù)包裝?

如何在 Go 中泛化函數(shù)包裝?

Go
阿晨1998 2022-06-27 16:17:39
我有以下界面:type Selector interface {    SelectOne(ctx context.Context, one A) (Result, error)    SelectTwo(ctx context.Context, one A, two B) ([]Result, error)    SelectThree(ctx context.Context, one A, two B, three C) ([]Result, error)}以及以下實(shí)現(xiàn):type Database struct{}func (d Database) SelectOne(...) (...) {...}func (d Database) SelectTwo(...) (...) {...}func (d Database) SelectThree(...) (...) {...}然后,最重要的是,我想添加一個(gè)使用非常好的 github.com/hashicorp/golang-lru 庫的緩存層:type SelectorCache struct {    db        Database    cacheOne *lru.Cache    cacheTwo *lru.Cache}func (c SelectorCache) SelectOne(ctx context.Context, one A) (Result, error) {    cached, ok := c.cacheOne.Get(makeKey(one))    if ok {        casted, ok := cached.(Result)        if ok {            return casted, nil        }    }    fetched, err := c.db.SelectOne(ctx, one)    if err != nil {        return Result{}, err    }    c.cache.Add(key, fetched)    return fetched, nil}func (c SelectorCache) SelectTwo(ctx context.Context, one A, two B) ([]Result, error) {    ...        casted, ok := cached.([]Result)    ...    fetched, err := c.db.SelectTwo(ctx, one, two)    ...}func () SelectThree(ctx context.Context, one A, two B, three C) ([]Result, error) {    ...        casted, ok := cached.([]Result)    ...    fetched, err := c.db.SelectThree(ctx, one, two, three)    ...}如您所見,每種情況下的緩存層基本相同,唯一的區(qū)別在于底層功能。如果那是 Python,我可以輕松地創(chuàng)建一個(gè)將 *a, **kw 傳遞給被包裝函數(shù)的包裝函數(shù)。我怎樣才能重寫它以便樣板消失?
查看完整描述

2 回答

?
慕容708150

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊

您可以編寫一個(gè)可變參數(shù)函數(shù)(請參閱函數(shù)類型),它將任意數(shù)量的ints 作為參數(shù)(零或更多)并一次性處理它們。例如


func (d Database) Select(ctx context.Context, numbers ...int)

numbers您可以在for 循環(huán)中迭代range并執(zhí)行您想要的操作。您的函數(shù)調(diào)用可以保持與以前相同。


fetched, err := c.db.Select(ctx, one)

fetched, err := c.db.Select(ctx, one, two)

fetched, err := c.db.Select(ctx, one, two, three)


查看完整回答
反對 回復(fù) 2022-06-27
?
縹緲止盈

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊

您在評論中提到參數(shù)類型有所不同。

一般來說,您可以這樣做:

  • 在編譯時(shí),或

  • 在運(yùn)行時(shí)。

運(yùn)行時(shí)版本更易于編碼和使用,并且非常靈活,但當(dāng)然有一些運(yùn)行時(shí)成本。也許您正試圖避免這種情況(這很好,但會(huì)讓人想起關(guān)于在優(yōu)化之前進(jìn)行測量的古老格言)。

編譯時(shí)版本是您在示例中編寫的。

我怎樣才能重寫它以便樣板消失?

對于 Go 1,只有一種方法可以做到這一點(diǎn):編寫程序來編寫程序。?? 這就是go generate全部。還有一篇關(guān)于它的Go 博客文章

在 Go 2 中,幾乎肯定會(huì)有泛型,你實(shí)際上可以稍微玩一下。他們將是做你想做的事的方式。


查看完整回答
反對 回復(fù) 2022-06-27
  • 2 回答
  • 0 關(guān)注
  • 130 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號