无缓冲通道(容量为0)
- 性能影响:无缓冲通道在发送和接收操作时是同步的。发送操作会阻塞,直到有接收者准备好接收数据;接收操作会阻塞,直到有发送者发送数据。这种同步特性在需要精确协调 goroutine 间数据传输时很有用,但由于阻塞操作,在高并发场景下如果协调不当,可能会导致性能瓶颈。
- 示例代码:
package main
import (
"fmt"
)
func main() {
ch := make(chan int)
go func() {
data := 42
fmt.Println("Sending data:", data)
ch <- data
}()
received := <-ch
fmt.Println("Received data:", received)
}
有缓冲通道(容量大于0)
- 性能影响:有缓冲通道允许在缓冲区未满时,发送操作不会阻塞,在缓冲区不为空时,接收操作不会阻塞。这在一定程度上可以减少 goroutine 的阻塞时间,提高并发性能。但如果缓冲区设置过大,可能会导致数据在缓冲区中积压,占用过多内存。
- 示例代码:
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 2)
ch <- 10
ch <- 20
fmt.Println("Sent two values without blocking")
data1 := <-ch
data2 := <-ch
fmt.Println("Received data:", data1, data2)
}