从通道中读取数据并间隔打印

Read data from channel and print it at interval

假设我们有(删除)goroutine,它删除了一些文件并通过通道将删除的文件计数(计数器)发送到(主)。
示例:

func main() {
    filesList := []string{"file1", "file2", "file3", "file4"}
    channelStream := make(chan int)

    go func(files []string, channel chan<- int) {
        defer close(channel)

        counter := 0
        for _, file := range files {
            err := os.Remove(file)
            if err != nil {
                log.Fatal(err)
            }
            counter += 1
            channel <- counter
        }
    }(filesList, channelStream)

    for msg := range channelStream { //Read from channel until it is closed

        fmt.Printf("\r--> " + strconv.Itoa(msg) + " files removed")
    }
}  

现在,每删除一个文件,(counter)就会被发送到(main),在那里打印到终端,即大量打印。
我的问题是:如何按时间间隔(比如说每 1 秒)打印(计数器)?

谢谢,

一个常见的选项是缓冲输出并定期刷新它,这将允许累积所有不同类型的输出:

out := bufio.NewWriter(os.Stdout)
defer out.Flush()

tick := time.NewTicker(time.Second)
defer tick.Stop()

for {
    select {
    case msg, ok := <-channelStream:
        if !ok {
            return
        }
        fmt.Fprintf(out, "--> %d files removed\n", msg)
        
    case <-tick.C:
        out.Flush()
    }
}

但是,由于您似乎只是在此处跟踪和更新计数器值,所以我只更新计数器本身并在每个时间间隔将其写出:

tick := time.NewTicker(time.Second)
defer tick.Stop()

var counter int
var ok bool
for {
    select {
    case msg, ok := <-channelStream:
        if !ok {
            fmt.Printf("\r--> %d files removed", counter)
            return
        }
        counter += msg
    case <-tick.C:
        fmt.Printf("\r--> %d files removed", counter)
    }
}