我正试图制作一个永无止境的自动收报机频道,但它只能工作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)
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Start
[8.9876 762.098568]
[8.9876 762.098568]
Run Code Online (Sandbox Code Playgroud)
这个:
for range <-md{
Run Code Online (Sandbox Code Playgroud)
是不一样的:
for range md{
Run Code Online (Sandbox Code Playgroud)
后者的范围超过通道(你想要的),而前者的范围超过了循环开始时从通道接收的值,这恰好是一个双元素阵列,因此是两次执行.您还忽略了for语句中从通道接收的值,并在循环体中再次读取它,忽略了通道上的所有其他消息(尽管这在示例中没有区别,因为每个值都相同,它会在实践中发挥重要作用).你真正想要的是:
for foo := range md{
fmt.Println(foo)
}
Run Code Online (Sandbox Code Playgroud)
这是你的游乐场示例的一个工作版本,略有修改以避免"程序花费太长时间"错误,因为它的当前形式永远不会停止:https://play.golang.org/p/RSUJFvluU5
| 归档时间: |
|
| 查看次数: |
527 次 |
| 最近记录: |