亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

禁用選擇語句的默認部分

禁用選擇語句的默認部分

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條經驗 獲得超8個贊

您不能禁用default子句,但可以case通過分配nil給 chan 來禁用子句。也許像下面的代碼一樣創建一個非??焖俚拇a。下面的代碼將 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 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號