在Go语言中,val, ok := <-ch 是一种常见的从通道(channel)中读取数据的方式。这里的 ch 是一个通道,val 是从通道中读取的值,ok 是一个布尔值,用于指示通道是否已经关闭。
val:从通道中读取的值。ok:如果通道已经关闭并且没有更多的值可以读取,ok 将为 false;否则,ok 为 true。这种语法通常用于在不确定通道是否关闭的情况下,安全地从通道中读取数据。
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("Channel closed!")
break
}
fmt.Println("Received:", val)
}
}
Received: 0
Received: 1
Received: 2
Received: 3
Received: 4
Channel closed!
ch。ch 发送 0 到 4 的整数,并在发送完毕后关闭通道。val, ok := <-ch 从通道中读取数据。如果通道关闭,ok 为 false,循环退出。<-ch 会阻塞,直到有数据可读或通道关闭。<-ch 会立即返回通道类型的零值,并且 ok 为 false。这种模式在处理并发任务时非常有用,尤其是在需要优雅地处理通道关闭的情况下。