gpt4 book ai didi

go - 使用 ticker 的 golang 代码有什么问题

转载 作者:数据小太阳 更新时间:2023-10-29 03:04:30 25 4
gpt4 key购买 nike

package main

import (
"fmt"
"time"
)

func main() {
intChan := make(chan int, 1)
ticker := time.NewTicker(time.Second)
go func() {
for _ = range ticker.C {
select {
case intChan <- 1:
case intChan <- 2:
case intChan <- 3:
}
}
/*defer */
fmt.Println("End. [sender]")
}()
var sum int
for e := range intChan {
fmt.Printf("Received: %v\n", e)
sum += e
if sum > 10 {
fmt.Printf("Got: %v\n", sum)
break
//ticker.Stop()
}
}
fmt.Println("End. [receiver]")
//time.Sleep(10)
}

我是 golang 的新手。在这段代码中,我想在 goroutine 结束时打印一次“End.[sender]”。我尝试使用 ticker.stop(),甚至 time.sleep(), defer ,但没有效果。这有什么问题,请给我一些想法。谢谢

最佳答案

作为documentation说,ticker.Stop 不会关闭 channel 。所以你不能指望中断循环。您可以添加新的退出 channel 。

package main

import (
"fmt"
"time"
)

func main() {
intChan := make(chan int, 2)
ticker := time.NewTicker(time.Second)
quit := make(chan bool)
go func() {
loop:
for {
select {
case <-ticker.C:
select {
case intChan <- 1:
case intChan <- 2:
case intChan <- 3:
}
case <-quit:
break loop
}
}
/*defer */
fmt.Println("End. [sender]")
close(intChan)
}()
var sum int
for e := range intChan {
fmt.Printf("Received: %v\n", e)
sum += e
if sum > 10 {
fmt.Printf("Got: %v\n", sum)
quit <- true
//break
//ticker.Stop()
}
}
fmt.Println("End. [receiver]")
//time.Sleep(10)
}

关于go - 使用 ticker 的 golang 代码有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44793019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com