在Golang中永远不会结束Ticker只工作2次
发布时间:2020-12-16 19:28:56 所属栏目:大数据 来源:网络整理
导读:我正试图制作一个永无止境的自动收报机频道,但它只能工作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 *5
我正试图制作一个永无止境的自动收报机频道,但它只能工作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
这个:
for range <-md{ 是不一样的: for range md{ 后者的范围超过通道(你想要的),而前者的范围超过了循环开始时从通道接收的值,这恰好是一个双元素阵列,因此是两次执行.您还忽略了在for语句中从通道接收到的值,并在循环体中再次读取它,忽略了通道上的所有其他消息(尽管这在示例中没有区别,因为每个值都相同,因此会在实践中产生重大影响).你真正想要的是: for foo := range md{ fmt.Println(foo) } 这是您的游乐场示例的工作版本,稍作修改以避免“程序花费太长时间”错误,因为在当前形式中它永远不会停止:https://play.golang.org/p/RSUJFvluU5 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |