草庐IT

go: 在 select 和 break 中过滤事件

coder 2024-07-07 原文

这是我目前的代码:

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
    }
}

首先,我是围棋初学者。上面的代码对我来说一般看起来太复杂了,我想它可以优化。

我想做什么:当一个事件到来时,我想检查给定的代码是否在过滤器列表中。过滤器有两个“维度”:命名空间和代码列表。 activeFiltersmap[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/

有关go: 在 select 和 break 中过滤事件的更多相关文章

  1. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  2. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  3. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  4. ruby-on-rails - 在 Controller 中干净地处理多个过滤器(参数) - 2

    我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告

  5. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  6. ruby-on-rails - 事件管理员和自定义方法 - 2

    这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什

  7. ruby-on-rails - Rails 3 - 过滤器链暂停为 :authentication rendered or redirected - 2

    我仍然收到标题中的“错误”消息,但不知道如何解决。在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

  8. ruby-on-rails - rails 上的 ruby : radio buttons for collection select - 2

    我有一个集合选择:此方法的单选按钮是什么?谢谢 最佳答案 Rails3中没有这样的助手。在Rails4中,它是collection_radio_buttons. 关于ruby-on-rails-rails上的ruby:radiobuttonsforcollectionselect,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/18525986/

  9. ruby-on-rails - ActiveAdmin 自定义选择过滤器下拉名称 - 2

    对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking

  10. ruby-on-rails - 在不重新查询数据库的情况下重新排序 Rails 中的事件记录? - 2

    例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果

随机推荐