面试题答案
一键面试在Go语言中,以下常见操作会导致通道阻塞:
- 发送操作阻塞:当向一个无缓冲通道发送数据时,如果没有其他goroutine在接收这个通道的数据,发送操作就会阻塞。例如:
package main
import (
"fmt"
)
func main() {
ch := make(chan int)
// 这里发送操作会阻塞,因为没有接收者
ch <- 1
fmt.Println("This line won't be reached")
}
- 接收操作阻塞:从无缓冲通道接收数据时,如果没有其他goroutine向这个通道发送数据,接收操作就会阻塞。例如:
package main
import (
"fmt"
)
func main() {
ch := make(chan int)
// 这里接收操作会阻塞,因为没有发送者
num := <-ch
fmt.Println(num)
}
- 向已满的有缓冲通道发送数据阻塞:有缓冲通道在缓冲区满时,再进行发送操作会阻塞。例如:
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")
}
- 从空的有缓冲通道接收数据阻塞:有缓冲通道在缓冲区为空时,进行接收操作会阻塞,直到有数据被发送进来。例如:
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int, 2)
// 缓冲区为空,这里接收操作会阻塞
num := <-ch
fmt.Println(num)
}