go - 无缓冲 channel -多值传递

标签 go

package main

import (
    "fmt"
)

func main() {
    in := make(chan int, 10)
    out := make(chan int)

    for i := 0; i < 10; i++ {
        in <- i
    }

    close(in)

    go func() {
        for {
            i, ok := <-in
            if !ok {
                close(out)
                break
            }

            out <- i * 2 //THIS LINE
        }
    }()

    for v := range out { // AND HERE
        fmt.Println(v)
    }
}
我对Go有点陌生,了解了缓冲 channel 和非缓冲 channel 之间的区别,但是我不确定这段代码如何工作。由于out channel 未缓冲,是否应该创建死锁?我想念什么?

最佳答案

out channel 是未缓冲的,因此如果您在没有其他goroutine等待读取的情况下对其进行写入,则它将阻塞。读取相同:它将阻塞直到另一个goroutine向其写入。因此,goroutine阻止写出,直到main中的for循环从中读取为止。主goroutine将从中读出,直到关闭为止,因此当goroutine最终关闭时,for循环终止。

关于go - 无缓冲 channel -多值传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62628595/

相关文章:

arrays - 如何在 Go 中分配非常量大小的数组

json - 解码嵌套的 JSON 结构

windows - 在golang中,程序完成后如何通过双击启动exe来保持控制台窗口打开

go - 在哪里以及如何记录项目维护者

json - 覆盖 json.Marshal 使用的布局来格式化 time.Time

go - 使用 Go 在一片结构中按时间平均

戈朗。仅从包中导入一个文件

go - 如何通过 Gin 的上下文传递 context.Context?

json - Golang json.Marshal() 忽略 ByteArray 字段中的 omitempty

Golang 获取系统语言