- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
现在我有一个用并行算法计算统计数据的小应用程序。现在我在扩展某些功能时遇到了问题。我会尽快解释。应用程序是建立在 revel 框架上的。 “stat” Controller 的一项操作采用传入的 POST json。解析它。并为任务和结果生成两个 channel (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”模型的相同接口(interface):
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
}
func Count(model NoaggRow, name string) float64{
m := map[string]func(NoaggRow) float64 {
"HOLD" : HOLD,
"INB" : INB,
"AHT" : AHT,
"RING" : RING,
"TALK" : TALK,
"ACW" : ACW,
"OCC" : OCC,
}
countedStat := statCount(model, m[name])
return countedStat
}
我需要用于 ASCI 模型的相同方法。对于 AcsiRow 而不是 NoaggRow。如何使此输入参数类型动态化或如何使方法对所有模型通用。只有数组和“map[string]func(......Row)”的名称在这个地方会有所不同。谁能帮我解决这个问题?
最佳答案
如果映射中的函数(即 HOLD()
、INB()
等)不需要比 StatModel 接口(interface)提供的更多的模型访问权限,那么您的要求应该可以通过更改这些函数来接收 StatModel 而不是 NoaggRow 来实现:
func HOLD(s StatModel) float64 {
...
}
然后你要添加的AcsiRow函数可以有相同的签名,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
}
免责声明:这只是一个基于我在帖子中看到的内容的想法。我对 Revel 一无所知,也许因此我可能错过了一些由 Revel 上下文引起的重要细节,这些细节会阻止实现此方法。
根据评论更新:
使用type assertions启用 HOLD
、OCC
等函数来访问结构特定的属性,如下所示:
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
...
}
这在运行时可能看起来有点冒险,但如果调用者总是将匹配的模型/名称值对传递给 Count()(我假设它这样做),则类型转换应该是安全的。
关于去 : model ( or interface ) function with input of different types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36769125/
我有两个文本输入元素 A 和 B。 我希望用户能够从 A 中选择部分或全部文本并拖动到 B,但文本不会从 A 中消失。 假设“A”包含“quick brown fox”,用户突出显示“fox”一词并将
我正在一个网站上工作,如果在提交表单之前数字不在最小值和最大值之间,我希望数字输入能够自行更正。我的代码如下: HTML: JavaScript: function CorrectOverUnder
在检查输入值是否存在并将其分配给变量时,我看到了两种实现此目的的方法: if(Input::has('id')) { $id = Input::get('id'); // do som
我意识到 有一个 border-box盒子模型,而有一个 content-box盒子模型。此行为存在于 IE8 和 FF 中。不幸的是,这使我无法将这种样式应用于大小均匀的输入: input, tex
在 Polymer 文档 ( https://elements.polymer-project.org/elements/iron-input ) 中,我发现: 而在另一个官方文档(https://
我使用 jquery 添加/删除输入 我使用append为日期/收入添加多个Tr 我还使用另一个附加来添加多个 td 以获取同一日期 Tr 中的收入 我添加多个日期输入,并在此表中添加多个收入输入 我
Python3 的 input() 似乎在两次调用 input() 之间采用旧的 std 输入。有没有办法忽略旧输入,只接受新输入(在 input() 被调用之后)? import time a =
在一些教程中,我看到了这些选择器: $(':input'); 或 $('input'); 注意“:”。 有什么不同吗? 最佳答案 $('input') = 仅包含元素名称,仅选择 HTML 元素。 $
我有下一个 html 表单: Nombre: El nombre es obligatorio. Solo se pe
有两种方法可以在组件上定义输入: @Component({ inputs: ['displayEntriesCount'], ... }) export class MyTable i
input: dynamic input is missing dimensions in profile onnx2trt代码报错: import numpy as np import tensor
所以,我有允许两个输入的代码: a, b = input("Enter a command: ").split() if(a == 'hello'): print("Hi") elif(a =
我有一个与用户交流的程序。我正在使用 input() 从用户那里获取数据,但是,我想告诉用户,例如,如果用户输入脏话,我想打印 You are swearing!立即删除它! 而 用户正在输入。 如您
我在运行 J2ME 应用程序时遇到了一些严重的内存问题。 所以我建立了另一个步骤来清除巨大的输入字符串并处理它的数据并清除它。但直到我设置 input = null 而不是 input = "" 才解
我想在我的 android 虚拟设备中同时启用软输入和硬键盘。我知道如何两者兼得,但不会两者。 同时想要BOTH的原因: 软输入:预览当键盘缩小屏幕时布局如何调整大小 硬键盘:显然是快速输入。 提前致
我有一个邮政编码字段,在 keyup 上我执行了一个 ajax 调用。如果没有可用的邮政编码,那么我想添加类“input-invalid”。但问题是,在我单击输入字段的外部 某处之前,红色边框验证不会
根据我的理解使用 @Input() name: string; 并在组件装饰器中使用输入数组,如下所示 @Component({ ... inputs:
我有一段代码是这样的 @Component({ selector: 'control-messages', inputs: ['controlName: control'],
在@component中, @input 和@output 属性代表什么以及它们的用途是什么? 什么是指令,为什么我们必须把指令放在下面的结构中? directives:[CORE_DIRECTIVE
有没有一种方法可以测试变量是否会使SAS中的INPUT转换过程失败?或者,是否可以避免生成的“NOTE:无效参数”消息? data _null_; format test2 date9.; inp
我是一名优秀的程序员,十分优秀!