现在我有一个使用并行算法计算统计数据的小应用程序。现在我在扩展部分功能时遇到了问题。我会尽快解释。应用程序建立在 revel 框架上。“stat”控制器的其中一项操作是接收传入的 POST json。解析它。并为任务和结果生成两个通道(goroutines)。所有这一切就像一个魅力。但我有模型的麻烦。我编写了能够线性扩展模型数量的代码,但目前只有一个在工作。
并不是所有的方法都被用于这种扩展。
在代码的某些部分我有这个:
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 模型正在实现“stat”模型的相同接口:
type StatModel interface {
FilterData(Filter)
ClusterData(Filter)
CountDataForChart(string)[]ChartElement
GroupByTreeGroups(Filter)[]OrgPack
}
但是现在我必须添加一些具有相同界面的新模型,但是有代码,我无法扩展。我不记得如何做到这一点..
func statCount(model NoaggRow, f func(NoaggRow) float64) float64 {
countedStat := f(model)
return countedStat
}
与 ASCI 模型所需的方法相同。对于 AcsiRow 而不是 NoaggRow。如何使此输入参数类型动态或如何使所有模型的方法通用。只有数组和“map[string]func(......Row)”的名称在这个地方会有所不同。谁能帮我解决这个问题?
红颜莎娜
相关分类