在Golang中永远不会结束Ticker只工作2次

时间:2017-08-17 17:07:05

标签: go

我正在尝试创建一个永无止境的自动收录器频道,但它只能工作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 个答案:

答案 0 :(得分:8)

此:

for range <-md{

与:

不同
for range md{

后者的范围超过通道(你想要的),而前者的范围超过当循环开始时从通道接收的值,这恰好是一个双元素数组,因此两次处决。您还忽略了for语句中从频道收到的值,并在循环体中再次从中读取,忽略了频道上的所有其他消息(尽管这没有区别在该示例中,由于每个值都相同,因此在实践中会产生显着差异)。你真正想要的是:

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

这是您的游乐场示例的工作版本,稍作修改,以避免“程序花费太长时间”错误,因为它的当前形式永远不会停止:https://play.golang.org/p/RSUJFvluU5