如何在Go语言中关闭通道?


我们可以使用 **close()** 函数在Go语言中关闭**通道**。通道关闭后,我们无法向其发送数据,但仍然可以从中读取数据。关闭的通道表示该通道上的工作已完成,无需保持打开状态。

我们在使用 **make** 关键字声明通道时打开它。

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!

更新于:2021年11月1日

3K+ 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告