2017-08-17 27 views
6

我試圖製作一個不結束代碼的頻道,但它只能使用2次。永不止步的Golang代碼作品只有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{ 

在溝道(你想要的),後者的範圍,同時在從信道接收時的值在循環開始前者範圍,這恰好是一個兩元件陣列,因此兩次執行。您還忽略了for語句中從頻道收到的值,並在循環體中再次從中讀取該值,並忽略該通道上的所有其他消息(儘管這在示例中沒有任何區別,因爲每個值都是相同的,這會在實踐中產生重大影響)。你真正想要的是:

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

這是你的遊樂場實例的工作版本,略作修改,以避免因爲以目前的形式「節目的時間太長」的錯誤就從未停止:https://play.golang.org/p/RSUJFvluU5

+0

非常感謝,它可以100% – moneyzmey

相關問題