第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何遍歷 go time.Tick 通道?

如何遍歷 go time.Tick 通道?

Go
慕斯709654 2021-10-18 14:50:29
我在使用time.Tick. 我希望這段代碼打印“嗨”10 次,然后在 1 秒后退出,但它掛起:ticker := time.NewTicker(100 * time.Millisecond)time.AfterFunc(time.Second, func () {    ticker.Stop()})for _ = range ticker.C {    go fmt.Println("hi")}https://play.golang.org/p/1p6-ViSvma查看源代碼,我看到Stop()調(diào)用時(shí)通道沒有關(guān)閉。在這種情況下,迭代代碼通道的慣用方法是什么?
查看完整描述

2 回答

?
婷婷同學(xué)_

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊

你是對的,股票的通道沒有在停止時(shí)關(guān)閉,這是在文檔中說明的:


停止關(guān)閉自動(dòng)收報(bào)機(jī)。停止后,將不再發(fā)送報(bào)價(jià)單。停止不會(huì)關(guān)閉通道,以防止從通道讀取不正確地成功。


我相信自動(dòng)收報(bào)機(jī)更多的是關(guān)于火和忘記,即使你想阻止它,你甚至可以永遠(yuǎn)掛起例行程序(當(dāng)然取決于你的應(yīng)用程序)。


如果你真的需要一個(gè)有限的股票代碼,你可以做一些技巧并提供一個(gè)單獨(dú)的頻道(根據(jù) ThunderCat 的回答),但我要做的是提供我自己的股票代碼實(shí)現(xiàn)。這應(yīng)該相對容易,并且會(huì)為您提供其行為的靈活性,例如在通道上傳遞什么或決定如何處理丟失的滴答聲(即當(dāng)讀者落后時(shí))。


我的例子:


func finiteTicker(n int, d time.Duration) <-chan time.Time {

    ch := make(chan time.Time, 1)

    go func() {

        for i := 0; i < n; i++ {

            time.Sleep(d)

            ch <- time.Now()

        }

        close(ch)

    }()

    return ch

}


func main() {   

    for range finiteTicker(10, 100*time.Millisecond) {

        fmt.Println("hi")

    }

}

http://play.golang.org/p/ZOwJlM8rDm


查看完整回答
反對 回復(fù) 2021-10-18
?
楊魅力

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊

我也在 IRC 上問過,從@Tv` 那里得到了一些有用的見解。


盡管timer.Ticker看起來它應(yīng)該是 go pipeline 的一部分,但它實(shí)際上并不能很好地與管道習(xí)語配合使用:


以下是管道建設(shè)指南:


當(dāng)所有發(fā)送操作完成后,stage 關(guān)閉它們的出站通道。

階段不斷從入站通道接收值,直到這些通道關(guān)閉或發(fā)送方被解除阻塞。

管道通過確保所有發(fā)送的值有足夠的緩沖區(qū)或在接收方可能放棄通道時(shí)明確通知發(fā)送方來解除對發(fā)送方的阻塞。


這種不一致的原因似乎主要是為了支持以下習(xí)語:


for {

    select {

    case <-ticker.C:

        // do something

    case <-done:

        return

    }

}

我不知道為什么會(huì)這樣,以及為什么沒有使用流水線習(xí)語:


for {

    select {

    case _, ok := <-ticker.C:

        if ok {

            // do something

        } else {

            return

        }

    }

}

(或更干凈)


for _ = range ticker.C {

    // do something

}

但這是要走的路:(


查看完整回答
反對 回復(fù) 2021-10-18
  • 2 回答
  • 0 關(guān)注
  • 230 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)