MST

星途 面试题库

面试题:Go语言并发编程之通道使用

在Go语言中,假设有两个goroutine,一个goroutine生成从1到100的整数并通过通道发送,另一个goroutine从该通道接收整数并计算其平方,最后打印结果。请编写代码实现这个过程,并说明通道在其中起到的作用。
38.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
)

func generateNumbers(ch chan int) {
    for i := 1; i <= 100; i++ {
        ch <- i
    }
    close(ch)
}

func calculateSquares(ch chan int) {
    for num := range ch {
        square := num * num
        fmt.Println(square)
    }
}

你可以在 main 函数中这样调用:

func main() {
    ch := make(chan int)
    go generateNumbers(ch)
    go calculateSquares(ch)
    select {}
}

通道在其中起到的作用

  1. 数据传递:通道作为两个 goroutine 之间的桥梁,使得生成整数的 goroutine 能够将数据安全地传递给计算平方的 goroutine。
  2. 同步:通道天然具有同步的特性。generateNumbers goroutine 在向通道发送数据时,如果 calculateSquares goroutine 还没有准备好接收,那么 generateNumbers 会阻塞,直到有接收者准备好。同样,calculateSquares goroutine 在接收数据时,如果 generateNumbers 还没有发送数据,它也会阻塞。这确保了数据的有序处理,避免了竞态条件。
  3. 通知结束:通过 close(ch) 关闭通道,calculateSquares goroutine 可以通过 for... range 循环优雅地检测到通道关闭,从而结束循环,知道不再有数据需要处理。