Бесконечный тикер в 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]

пример:https://play.golang.org/p/P2FaUwbW-3

1 ответов


это:

for range <-md{

это не то же, что:

for range md{

последний колеблется над каналом (что вы хотите), в то время как первый колеблется над значение, полученное от канала при запуске цикла, который оказывается двухэлементным массивом, следовательно, два выполнения. Вы также игнорируете значение, полученное от канала в for заявление, и чтение из него снова в теле цикла, игнорируя другие сообщения на канал (хотя это не имеет никакого значения в примере, поскольку каждое значение идентично, это будет иметь существенное значение на практике). То, что вы действительно хотите:

for foo := range md{
    fmt.Println(foo)
}

вот рабочая версия вашего примера playground, слегка измененная, чтобы избежать ошибок" программа заняла слишком много времени", потому что в своей текущей форме она никогда не останавливается:https://play.golang.org/p/RSUJFvluU5