这是我目前的代码:
for {
select {
case event := <-events:
if event.Msg != nil && len(activeFilters) > 0 {
//filter for messages
matches := false
for k, v := range activeFilters {
if k == event.Msg.Namepace {
for _, code := range v {
if code != event.Msg.Code {
matches = true
break //BREAK1
}
}
if matches {
break //BREAK2
}
}
}
if !matches {
break //BREAK3
}
}
if err := sendEvent(event); err != nil {
sendErr(err)
return
}
case <-closed:
return
}
}
首先,我是围棋初学者。上面的代码对我来说一般看起来太复杂了,我想它可以优化。
我想做什么:当一个事件到来时,我想检查给定的代码是否在过滤器列表中。过滤器有两个“维度”:命名空间和代码列表。 activeFilters是 map[string][]uint64 .
(注意:我可以将 activeFilters 重新设计为其他结构)。
所以我只想阻止代码执行sendEvent如果过滤器不匹配,则 sendEvent如果协议(protocol)与 activeFilters 中的任何键匹配,则应执行并且消息代码包含在该键的值数组中。
那么上面的代码可以简化吗?是break的用法(BREAK1 和 BREAK2)正确吗?我似乎需要 BREAK2,因为内部 for循环可能已经找到匹配项,在这种情况下,无需继续迭代 activeFilters .
最后,我使用 BREAK3 是否正确?我的想法是,如果没有匹配项,我不想执行 sendEvent ,所以我想跳出case .在我有限Go理解、使用return那里会关闭 channel 或类似的东西....
:脸红
最佳答案
如果 activeFilters 是一个 map,您不需要迭代它来找到一个键 - 这就是 map 的全部意义.你可以:
if v,ok := activeFilters[event.Msg.Namepace]; ok {
// range over v as you are now
} else {
// event.Msg.Namepace does not exist in the map
}
这消除了一个循环,因此消除了一个break。最后一个 break (BREAK 3) 有效,但不是特别清楚它在做什么;我将其作为条件以使其更具可读性:
if matches {
if err := sendEvent(event); err != nil {
sendErr(err)
return
}
}
return 不会关闭 channel (假设在其他地方有另一个对它的引用,它必须是这样才能工作),但它会退出你的循环,所以没有进一步消息将被处理。我还会仔细检查错误情况下的返回值是否真的是您想要的;通常在这些情况下,您会记录错误,但会继续处理来自 channel 的 future 消息。
关于go: 在 select 和 break 中过滤事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45044434/
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什
我仍然收到标题中的“错误”消息,但不知道如何解决。在ApplicationController中,classApplicationController在routes.rb#match'set_activity_account/:id/:value'=>'users#account_activity',:as=>:set_activity_account--thisdoesn'tworkaswell..resources:usersdomemberdoget:action_a,:action_bendcollectiondoget'account_activity'endend和User
我有一个集合选择:此方法的单选按钮是什么?谢谢 最佳答案 Rails3中没有这样的助手。在Rails4中,它是collection_radio_buttons. 关于ruby-on-rails-rails上的ruby:radiobuttonsforcollectionselect,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/18525986/
对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking
例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果