Бесконечный тикер в Golang работает только 2 раза
Я пытаюсь сделать канал с бесконечным тикером, но он работает только 2 раза.
не могли бы вы помочь мне понять, где проблема?
код:
package main
import (
"fmt"
"time"
)
var mark = [2]float64{8.9876, 762.098568}
func tick(out chan <- [2]float64){
c := time.NewTicker(time.Millisecond *500)
for range c.C{
out <- mark
}
}
func main() {
fmt.Println("Start")
md := make(chan [2]float64)
go tick(md)
for range <-md{
fmt.Println(<-md)
}
}
выход:
Start
[8.9876 762.098568]
[8.9876 762.098568]
1 ответов
это:
for range <-md{
это не то же, что:
for range md{
последний колеблется над каналом (что вы хотите), в то время как первый колеблется над значение, полученное от канала при запуске цикла, который оказывается двухэлементным массивом, следовательно, два выполнения. Вы также игнорируете значение, полученное от канала в for
заявление, и чтение из него снова в теле цикла, игнорируя другие сообщения на канал (хотя это не имеет никакого значения в примере, поскольку каждое значение идентично, это будет иметь существенное значение на практике). То, что вы действительно хотите:
for foo := range md{
fmt.Println(foo)
}
вот рабочая версия вашего примера playground, слегка измененная, чтобы избежать ошибок" программа заняла слишком много времени", потому что в своей текущей форме она никогда не останавливается:https://play.golang.org/p/RSUJFvluU5