go - 填充缓冲 channel 直到变满或持续时间过去

标签 go

我有一个缓冲的 chan string,我一直用随机字符串填充它直到 time.Duration 过去或直到它变满。

我的问题是考虑到它是一次性任务,我应该使用自动收报机还是有更方便的方法?

这是我目前的做法

package main

import (
    "fmt"
    "time"
)

func main() {
    res := fillChan(time.Duration(1*time.Nanosecond), 100000)
    fmt.Println(len(res))
}

func fillChan(maxDuration time.Duration, chanSize int) chan string {
    c := make(chan string, chanSize)

    ticker := time.NewTicker(maxDuration)

    for {
        select {
        case <-ticker.C:
            ticker.Stop()
            return c
        case c <- "Random message":
        default:
            return c
        }
    }

}

最佳答案

我不是 Go 专家(事实上,我从未使用过它),但文档建议 Timer , 或 After对于单个事件。

select {
case <-time.After(1*time.Nanosecond):
    return c
case c <- "Random message":
default:
    return c
}

关于go - 填充缓冲 channel 直到变满或持续时间过去,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32666182/

相关文章:

go - 如何在 Gorm 中正确执行部分更新?

json - 转换仅包含 1 个数组字段的 JSON

go - 在 Gosync.Map 中,为什么这部分实现不一致或者我误解了什么?

go - 解码为结构时 JSON 输入意外结束

sql - Go 中使用 SQL 驱动程序的连接池

arrays - 从 golang 中的 redash 解码 json 原始数据

google-app-engine - 在 Go Lang 中为整个结构设置标签

go - Go 中 fmt.Println() 和 println() 的区别

webserver - 从根目录提供主页和静态内容

variables - GO:根据参数个数获取if else block 中的各种查询结果