返回介绍

Range 和 Close

发布于 2024-10-12 12:35:56 字数 1001 浏览 0 评论 0 收藏 0

上面这个例子中,需要读取两次 c,这样不是很方便,Go 考虑到了这一点,所以也可以通过 range,像操作 slice 或者 map 一样操作缓存类型的 channel,请看下面的例子

package main
import (
    "fmt"
)
func fibonacci(n int, c chan int) {
    x, y := 1, 1
    for i := 0; i < n; i++ {
        c <- x
        x, y = y, x + y
    }
    close(c)
}
func main() {
    c := make(chan int, 10)
    go fibonacci(cap(c), c)
    for i := range c {
        fmt.Println(i)
    }
}

for i := range c 能够不断的读取 channel 里面的数据,直到该 channel 被显式的关闭。上面代码看到可以显式的关闭 channel ,生产者通过内置函数 close 关闭 channel 。关闭 channel 之后就无法再发送任何数据了,在消费方可以通过语法 v, ok := <-ch 测试 channel 是否被关闭。如果 ok 返回 false,那么说明 channel 已经没有任何数据并且已经被关闭。

记住应该在生产者的地方关闭 channel ,而不是消费的地方去关闭它,这样容易引起 panic

另外记住一点的就是 channel 不像文件之类的,不需要经常去关闭,只有确实没有任何发送数据了,或者想显式的结束 range 循环之类的

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文