如何在 Golang 中关闭通道?

go programmingserver side programmingprogramming更新于 2025/4/10 17:52:17

我们可以在 Golang 中借助 close() 函数关闭通道。一旦通道关闭,我们就无法向其发送数据,但仍可以从中读取数据。关闭的通道表示我们想要显示此通道上的工作已完成,并且不需要打开它的情况。

我们在使用 ma​​ke 关键字声明通道时立即打开该通道。

ch := make(chan int)

示例 1

让我们考虑一个非常简单的例子,我们将创建一个缓冲通道,然后将数据传递给它,然后关闭该通道。

考虑下面显示的代码。

package main

import "fmt"

func main() {
   ch := make(chan int, 3)

   ch <- 2
   ch <- 3

   close(ch)
   fmt.Println("Channel closed!")
}

输出

如果我们在上述代码上运行命令 go run main.go,那么我们将在终端中得到以下输出。

Channel closed!

示例 2

需要注意的是,如果我们在通道关闭后尝试向其发送一些值,那么我们将得到一个 panic

考虑下面显示的代码。

package main

import "fmt"

func main() {
   ch := make(chan int, 3)

   ch <- 2
   ch <- 3

   close(ch)

   ch <- 5
   fmt.Println("Channel closed!")
}

输出

如果我们在上面的代码上运行命令go run main.go,那么我们将在终端中得到以下输出。

panic: send on closed channel

goroutine 1 [running]:
main.main()
/home/cg/root/2773125/main.go:13 +0xd4
exit status 2

示例 3

尽管我们无法向已关闭的通道发送数据,但我们仍然可以从已关闭的通道读取数据。请考虑以下代码。

package main

import "fmt"

func main() {
   ch := make(chan int, 3)

   ch <- 2
   ch <- 3

   close(ch)

   <-ch
   fmt.Println("Channel closed!")
}

输出

如果我们在上面的代码上运行命令go run main.go,那么我们将在终端中得到以下输出。

Channel closed!

相关文章