Golang中通道关闭与未关闭的问题探讨

Golang中通道关闭与未关闭的问题探讨 为什么第二次从通道获取输出时显示channel closed: false? 显然,channel closed: false等同于通道处于开启状态。但如果通道已经被关闭,它怎么可能还是开启状态呢?!

ch := make(chan int)
go func() {
    ch <- 1
    close(ch)
}()
v, isClosed := <-ch
fmt.Printf("received %d, is channel closed: %v\n", v, isClosed)
v, isClosed = <-ch
fmt.Printf("received %d, is channel closed: %v\n", v, isClosed)

更多关于Golang中通道关闭与未关闭的问题探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

对!用词不当,ok 并不是 Go 的关键字。感谢 @NobbZ

更多关于Golang中通道关闭与未关闭的问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好 @cinematik

这里的 isClosed 用法不正确。通道返回的第二个值表示是否成功接收到值。

参考:https://tour.golang.org/concurrency/4

kync: 我建议你使用 ok 关键字

ok 不是关键字,它只是一个标识符,按照惯例用于布尔类型的第二个返回值来表示操作成功。

func main() {
    if value, ok := someMap[key]; ok {
        fmt.Println(value)
    }
}

嗨,@cinematik

接收操作的第二个结果并不是判断通道是否关闭,而是表示接收是否成功:https://golang.org/ref/spec#Receive_operator,这类似于从映射中查找结果时的操作:v, ok := a[x]

回到顶部