MST

星途 面试题库

面试题:Go中带缓冲通道(Buffered Channel)的特点及基础使用

请解释Go语言中带缓冲通道(Buffered Channel)和无缓冲通道的区别,并编写一段代码示例,展示带缓冲通道在生产者 - 消费者模型中的简单应用,包括通道的创建、数据的发送和接收,且要处理可能出现的通道关闭等情况。
12.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

区别

  1. 无缓冲通道
    • 无缓冲通道在发送和接收数据时是同步的。当一个goroutine尝试向无缓冲通道发送数据时,它会阻塞,直到另一个goroutine从该通道接收数据。同样,当一个goroutine尝试从无缓冲通道接收数据时,它也会阻塞,直到有数据被发送到该通道。
    • 无缓冲通道常用于多个goroutine之间的同步,确保数据在不同goroutine之间的有序传递。
  2. 带缓冲通道
    • 带缓冲通道允许在通道中缓存一定数量的数据。发送操作只有在通道已满时才会阻塞,接收操作只有在通道为空时才会阻塞。
    • 带缓冲通道常用于解耦生产者和消费者,允许生产者在消费者处理数据的同时继续生产数据,只要通道的缓冲区未满。

代码示例

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)
}

在上述代码中:

  1. producer 函数是生产者,它向带缓冲通道 ch 发送数据,发送完成后关闭通道。
  2. consumer 函数是消费者,它使用 for... range 循环从通道接收数据,当通道关闭时,循环会自动结束。
  3. main 函数中,创建了一个带缓冲通道 ch,并启动生产者goroutine,然后调用消费者函数处理数据。