2017-08-17 6 views
6

私は終わりのないティッカーでチャンネルを作ろうとしていますが、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

+0

これはの一つであります新しいユーザーから見た最初の最小限で完全で検証可能な例です。大きな質問moneyzmey、それを維持し、StackOverflowへようこそ。 – Addison

答えて

8

この:

for range <-md{ 

は同じではありません

for range md{ 

チャネル上後者の範囲(欲しいもの)、2要素アレイであることを起こるループがを開始チャネルから受信した元の範囲超える値、一方、したがって2つの実行。 forステートメントのチャンネルから受け取った値を無視し、ループ本体のからもう一度を読み込み、チャンネルの他のすべてのメッセージは無視します(例では違いはありませんが、それは実際には大きな違いをもたらすだろう)。何が本当にしたいことは次のとおりです。ここで

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

あなたの遊び場例の作業バージョンです、少し、その現在の形でのエラー「プログラムは時間がかかりすぎた」を避けるために変更され、それは決して停止しない:https://play.golang.org/p/RSUJFvluU5

+0

ありがとう、それは100% – moneyzmey

関連する問題