2 回答

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

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
}
但這是要走的路:(
- 2 回答
- 0 關(guān)注
- 230 瀏覽
添加回答
舉報(bào)