为了账号安全,请及时绑定邮箱和手机立即绑定

禁用选择语句的默认部分

禁用选择语句的默认部分

Go
一只名叫tom的猫 2022-06-13 10:42:23
我想要一种在选择语句的默认部分进行处理的方法,然后稍后禁用默认值。我在下面的代码中使用了 if 语句,但是,在完成后,我们只有一个繁忙的循环(当通道为空时)将继续旋转测试完成的标志,这将始终为真。这似乎不是正确的方法。for {    select {    case p := <-subscriber.Next:        ...    case err := <subsriber.OnError:        ...    default:        if !finished {            subscriber.Subscribe(name, params)            ...            if ... { finished = true }        }            }}我知道你不能禁用默认部分,但必须有更好的方法来做到这一点。
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

您不能禁用default子句,但可以case通过分配nil给 chan 来禁用子句。也许像下面的代码一样创建一个非常快速的代码。下面的代码将 chanC从股票代码分配给defaultCh然后通过分配禁用它nil。


    ticker := time.NewTicker(time.Microsecond)

    defaultCh := ticker.C

    for {

        select {

            case p := <-subscriber.Next:

                ...

            case err := <subscriber.OnError:

                ...

            case <-defaultCh:

                subscriber.Subscribe(name, params)

                ...

                if finished {

                    defaultCh = nil

                    ticker.Stop()

                }

            }

        }

    }


查看完整回答
反对 回复 2022-06-13
?
MMTTMM

TA贡献1869条经验 获得超4个赞

我不知道有任何内置功能可以执行此操作,但您可以根据您的状态输入两个不同的选择语句。


for {

    // Without default case, wait only for cases

    if finished {

        select {

        case p := <-subscriber.Next:

            //...

        case err := <-subsriber.OnError:

            //...

        }

    } else {

        // Allow default case

        select {

        case p := <-subscriber.Next:

            //...

        case err := <-subsriber.OnError:

            //...

        default:

            subscriber.Subscribe(name, params)

        }

    }

}

这当然会导致代码重复,但至少它不会进入循环只是发现什么都不需要做。


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信