2017-08-17 21 views
6

Tôi đang cố gắng tạo kênh không bao giờ kết thúc, nhưng chỉ hoạt động 2 lần.Không bao giờ kết thúc Ticker ở Golang chỉ hoạt động 2 lần

Bạn có thể giúp tôi hiểu vấn đề ở đâu không?

Code:

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) 
    } 
} 

Output:

Start 
[8.9876 762.098568] 
[8.9876 762.098568] 

Ví dụ: https://play.golang.org/p/P2FaUwbW-3

+0

Đây là một trong các ví dụ tối thiểu, đầy đủ và có thể xác minh được mà tôi từng thấy từ một người dùng mới. Câu hỏi tuyệt vời moneyzmey, giữ nó lên, và chào mừng bạn đến StackOverflow. – Addison

Trả lời

8

này:

for range <-md{ 

là không giống nhau như:

0.123.
for range md{ 

Các dãy thứ hai trên kênh (những gì bạn muốn), trong khi các dãy cựu trên giá trị nhận được từ kênh khi vòng lặp bắt đầu, mà sẽ xảy ra là một mảng hai yếu tố, do đó hai hành . Bạn cũng bỏ qua giá trị nhận được từ kênh trong câu lệnh for và đọc lại từ đó lần nữa trong nội dung vòng lặp, bỏ qua mọi thông báo khác trên kênh (mặc dù điều này không có sự khác biệt trong ví dụ, vì mọi giá trị đều giống nhau , nó sẽ tạo ra sự khác biệt đáng kể trong thực tế). Những gì bạn thực sự muốn là:

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

Dưới đây là một phiên bản làm việc của ví dụ sân chơi của bạn, một chút thay đổi để tránh "chương trình mất quá nhiều thời gian" sai lầm vì trong hình thức hiện tại của nó không bao giờ dừng lại: https://play.golang.org/p/RSUJFvluU5

+0

Cảm ơn bạn rất nhiều, nó hoạt động 100% – moneyzmey

Các vấn đề liên quan