MST

星途 面试题库

面试题:Go中如何安全关闭channel并避免常见错误

请阐述在Go语言中,安全关闭一个channel的常规做法,并说明为什么不能在多个goroutine中关闭同一个channel,以及如果这样做可能会导致什么错误。
14.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

安全关闭一个channel的常规做法

在Go语言中,通常由发送方来关闭channel。例如:

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int)
    go func() {
        for i := 0; i < 5; i++ {
            ch <- i
        }
        close(ch) // 发送方关闭channel
    }()

    for val := range ch {
        fmt.Println(val)
    }
}

这样接收方可以通过 for... range 循环来优雅地处理channel关闭后的情况,直到channel关闭,循环结束。

不能在多个goroutine中关闭同一个channel的原因及可能导致的错误

  1. 原因:Go语言的设计理念是每个资源应该有一个明确的所有者。关闭channel应该由负责向该channel发送数据的那个goroutine来完成,这有助于明确责任,避免混乱。
  2. 可能导致的错误:如果多个goroutine关闭同一个channel,会导致运行时错误 panic: close of closed channel。这是因为当一个channel已经被关闭后,再次关闭它会触发这个panic。在多个goroutine竞争关闭同一个channel时,无法确定哪个goroutine会先关闭它,后续的关闭操作就会导致这个错误,使程序异常终止。