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

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

GO:具有不同類型輸入的模型(或接口)函數(shù)

GO:具有不同類型輸入的模型(或接口)函數(shù)

Go
狐的傳說(shuō) 2022-01-04 21:19:43
現(xiàn)在我有一個(gè)使用并行算法計(jì)算統(tǒng)計(jì)數(shù)據(jù)的小應(yīng)用程序?,F(xiàn)在我在擴(kuò)展部分功能時(shí)遇到了問題。我會(huì)盡快解釋。應(yīng)用程序建立在 revel 框架上?!皊tat”控制器的其中一項(xiàng)操作是接收傳入的 POST json。解析它。并為任務(wù)和結(jié)果生成兩個(gè)通道(goroutines)。所有這一切就像一個(gè)魅力。但我有模型的麻煩。我編寫了能夠線性擴(kuò)展模型數(shù)量的代碼,但目前只有一個(gè)在工作。并不是所有的方法都被用于這種擴(kuò)展。在代碼的某些部分我有這個(gè):for t := range in {        for sourceName, charts := range t.Request.Charts {            var cacheData []byte            var deserializedData models.StatModel            //determine the model type            switch sourceName {            case "noagg":                deserializedData = new(models.NoaggModel)            case "acsi":                deserializedData = new(models.AcsiModel)            }            cache_err := cache.Get(string(string(sourceName) + "_" + string(t.Date)), &cacheData);            if cache_err != nil {                panic("the cache is empty")            }            marshal_error := json.Unmarshal([]byte(cacheData), &deserializedData)            if marshal_error == nil {            }            deserializedData.FilterData(t.Request.Filters)            deserializedData.ClusterData(t.Request.Filters)            w := Work{}            for _, chart := range charts {                countedData := ChartElements{}                if marshal_error == nil {                    countedData = deserializedData.CountDataForChart(string(chart.Name))                }else {                    panic("some is bad")                }                w.Name, w.Data = chart.Name, countedData                out <- w            }        }    }Noagg 模型和 Asci 模型正在實(shí)現(xiàn)“stat”模型的相同接口:type StatModel interface {    FilterData(Filter)    ClusterData(Filter)    CountDataForChart(string)[]ChartElement    GroupByTreeGroups(Filter)[]OrgPack}但是現(xiàn)在我必須添加一些具有相同界面的新模型,但是有代碼,我無(wú)法擴(kuò)展。我不記得如何做到這一點(diǎn)..func statCount(model NoaggRow, f func(NoaggRow) float64) float64 {    countedStat := f(model)    return countedStat}與 ASCI 模型所需的方法相同。對(duì)于 AcsiRow 而不是 NoaggRow。如何使此輸入?yún)?shù)類型動(dòng)態(tài)或如何使所有模型的方法通用。只有數(shù)組和“map[string]func(......Row)”的名稱在這個(gè)地方會(huì)有所不同。誰(shuí)能幫我解決這個(gè)問題?
查看完整描述

1 回答

?
紅顏莎娜

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

如果地圖中的函數(shù)(即HOLD()、INB()、 等)不需要比 StatModel 接口提供的更多的模型訪問權(quán)限,那么您的需求應(yīng)該可以通過更改這些函數(shù)來(lái)接收 StatModel 而不是 NoaggRow 來(lái)實(shí)現(xiàn):


func HOLD(s StatModel) float64 {

    ...

}

那么你要添加的AcsiRow函數(shù)可以有相同的簽名,statCount和Count可以改寫如下:


func statCount(model StatModel, f func(StatModel) float64) float64 {

    countedStat := f(model)

    return countedStat

}


func Count(model StatModel, name string) float64 {

    m := map[string]func(StatModel) float64 {

        "HOLD" : HOLD,

        "INB"  : INB,

        "AHT"  : AHT,

        "RING" : RING,

        "TALK" : TALK,

        "ACW"  : ACW,

        "OCC"  : OCC,

        // Map AcsiModel functions here, let's call them ACSIn here

        // (you mentioned that the names would be different, so

        // I assume they don't get in the way of the functions

        // above):

        "ACSI1": ACSI1,

        "ACSI2": ACSI2,

        "ACSI3": ACSI3,

    }

    countedStat := statCount(model, m[name])

    return countedStat

}

免責(zé)聲明:這只是基于我在帖子中看到的內(nèi)容的一個(gè)想法。我對(duì) Revel 一無(wú)所知,因此也許我可能錯(cuò)過了一些由 Revel 上下文引起的重要細(xì)節(jié),這些細(xì)節(jié)會(huì)阻止實(shí)施這種方法。


根據(jù)評(píng)論更新:


使用類型的斷言,以使HOLD,OCC等功能,以訪問結(jié)構(gòu)特定的屬性,像這樣:


func HOLD (s StatModel) float64 {

    noagg, ok := s.(NoaggRow) // typecast from StateModel to NoaggRow

    if !ok {

        // Looks like the caller did not pass a matching model/name pair into Count().

        // Error handling...

    }

    attr := noagg.AttributeSpecificToNoaggRow

    ...

}

這在運(yùn)行時(shí)可能看起來(lái)有點(diǎn)危險(xiǎn),但如果調(diào)用者總是將匹配的模型/名稱值對(duì)傳遞給 Count()(我假設(shè)它這樣做了),則類型轉(zhuǎn)換應(yīng)該是安全的。



查看完整回答
反對(duì) 回復(fù) 2022-01-04
  • 1 回答
  • 0 關(guān)注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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