MST

星途 面试题库

面试题:Go语言中通道阻塞的常见场景有哪些

请简要阐述在Go语言编程中,哪些常见操作会导致通道发生阻塞,并举例说明。
14.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,以下常见操作会导致通道阻塞:

  1. 发送操作阻塞:当向一个无缓冲通道发送数据时,如果没有其他goroutine在接收这个通道的数据,发送操作就会阻塞。例如:
package main

import (
    "fmt"
)

func main() {
    ch := make(chan int)
    // 这里发送操作会阻塞,因为没有接收者
    ch <- 1
    fmt.Println("This line won't be reached")
}
  1. 接收操作阻塞:从无缓冲通道接收数据时,如果没有其他goroutine向这个通道发送数据,接收操作就会阻塞。例如:
package main

import (
    "fmt"
)

func main() {
    ch := make(chan int)
    // 这里接收操作会阻塞,因为没有发送者
    num := <-ch
    fmt.Println(num)
}
  1. 向已满的有缓冲通道发送数据阻塞:有缓冲通道在缓冲区满时,再进行发送操作会阻塞。例如:
package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int, 2)
    ch <- 1
    ch <- 2
    // 缓冲区已满,这里发送操作会阻塞
    ch <- 3
    fmt.Println("This line won't be reached")
}
  1. 从空的有缓冲通道接收数据阻塞:有缓冲通道在缓冲区为空时,进行接收操作会阻塞,直到有数据被发送进来。例如:
package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int, 2)
    // 缓冲区为空,这里接收操作会阻塞
    num := <-ch
    fmt.Println(num)
}