面试题答案
一键面试性能优势
- 强制同步:无缓冲通道在发送和接收操作时会阻塞,直到对应的接收或发送操作就绪。这确保了数据的实时同步,避免了数据竞争等并发问题。而有缓冲通道在缓冲区未满或未空时不会阻塞,可能导致数据异步处理,增加同步复杂性。
- 减少内存占用:有缓冲通道需要预先分配一定大小的缓冲区,这会占用额外的内存。无缓冲通道不需要额外的缓冲区内存,在内存使用上更高效,尤其在通道传递的数据量不大且注重内存优化的场景下优势明显。
示例
package main
import (
"fmt"
)
func main() {
// 创建无缓冲通道
ch := make(chan int)
go func() {
data := 42
fmt.Println("准备发送数据:", data)
ch <- data
fmt.Println("数据已发送")
}()
receivedData := <-ch
fmt.Println("接收到数据:", receivedData)
}
在上述示例中,无缓冲通道 ch
确保了数据发送和接收的同步。go
协程中,发送数据前打印“准备发送数据”,发送后打印“数据已发送”;主协程接收数据后打印“接收到数据”。如果使用有缓冲通道且缓冲区有空间,可能在主协程还未准备好接收时,go
协程就已完成发送,无法保证这种严格的同步顺序。