3 回答
TA贡献1829条经验 获得超13个赞
在第二个通道上发出“完成”信号,并在你的 goroutine 中选择股票代码和完成通道。
根据您真正想做的事情,可能存在更好的解决方案,但这很难从简化的演示代码中看出。
TA贡献1898条经验 获得超8个赞
按照沃尔克的建议使用第二个频道。这就是我最终运行的内容:
package main
import (
"log"
"time"
)
// Run the function every tick
// Return false from the func to stop the ticker
func Every(duration time.Duration, work func(time.Time) bool) chan bool {
ticker := time.NewTicker(duration)
stop := make(chan bool, 1)
go func() {
defer log.Println("ticker stopped")
for {
select {
case time := <-ticker.C:
if !work(time) {
stop <- true
}
case <-stop:
return
}
}
}()
return stop
}
func main() {
stop := Every(1*time.Second, func(time.Time) bool {
log.Println("tick")
return true
})
time.Sleep(3 * time.Second)
log.Println("stopping ticker")
stop <- true
time.Sleep(3 * time.Second)
}
TA贡献1830条经验 获得超3个赞
你可以这样做。
package main
import (
"fmt"
"time"
)
func startTicker(f func()) chan bool {
done := make(chan bool, 1)
go func() {
ticker := time.NewTicker(time.Second * 1)
defer ticker.Stop()
for {
select {
case <-ticker.C:
f()
case <-done:
fmt.Println("done")
return
}
}
}()
return done
}
func main() {
done := startTicker(func() {
fmt.Println("tick...")
})
time.Sleep(5 * time.Second)
close(done)
time.Sleep(5 * time.Second)
}
- 3 回答
- 0 关注
- 269 浏览
添加回答
举报