面试题答案
一键面试区别
- 无缓冲通道:
- 无缓冲通道在发送和接收数据时是同步的。当一个goroutine尝试向无缓冲通道发送数据时,它会阻塞,直到另一个goroutine从该通道接收数据。同样,当一个goroutine尝试从无缓冲通道接收数据时,它也会阻塞,直到有数据被发送到该通道。
- 无缓冲通道常用于多个goroutine之间的同步,确保数据在不同goroutine之间的有序传递。
- 带缓冲通道:
- 带缓冲通道允许在通道中缓存一定数量的数据。发送操作只有在通道已满时才会阻塞,接收操作只有在通道为空时才会阻塞。
- 带缓冲通道常用于解耦生产者和消费者,允许生产者在消费者处理数据的同时继续生产数据,只要通道的缓冲区未满。
代码示例
package main
import (
"fmt"
)
func producer(ch chan<- int, num int) {
for i := 0; i < num; i++ {
ch <- i
fmt.Printf("Produced: %d\n", i)
}
close(ch)
}
func consumer(ch <-chan int) {
for val := range ch {
fmt.Printf("Consumed: %d\n", val)
}
}
func main() {
// 创建带缓冲通道,缓冲区大小为3
ch := make(chan int, 3)
go producer(ch, 5)
consumer(ch)
}
在上述代码中:
producer
函数是生产者,它向带缓冲通道ch
发送数据,发送完成后关闭通道。consumer
函数是消费者,它使用for... range
循环从通道接收数据,当通道关闭时,循环会自动结束。- 在
main
函数中,创建了一个带缓冲通道ch
,并启动生产者goroutine,然后调用消费者函数处理数据。