在Go语言中,val, ok := <-ch
是一种常见的从通道(channel)读取数据的方式。这里的 ch
是一个通道,val
是从通道中读取的值,ok
是一个布尔值,用于指示通道是否已关闭。
val
:从通道中读取的值。ok
:如果通道未关闭且成功读取到值,ok
为 true
;如果通道已关闭且没有值可读,ok
为 false
。这种语法通常用于判断通道是否已关闭。当通道关闭时,继续从通道读取会返回通道类型的零值,并且 ok
为 false
。
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch <- i
time.Sleep(time.Second)
}
close(ch) // 关闭通道
}()
for {
val, ok := <-ch
if !ok {
fmt.Println("通道已关闭")
break
}
fmt.Println("读取到值:", val)
}
}
读取到值: 0
读取到值: 1
读取到值: 2
读取到值: 3
读取到值: 4
通道已关闭
ok
为 false
。for
循环来持续从通道读取数据,直到通道关闭。<-ch
会阻塞当前 goroutine,直到有数据可读或通道关闭。false
,不会阻塞。通过这种方式,你可以安全地从通道中读取数据,并在通道关闭时做出相应的处理。