首页 > 其他分享 >Golang channel的关闭

Golang channel的关闭

时间:2023-12-28 11:03:49浏览次数:22  
标签:遍历 intChan make chan Golang 关闭 channel


使用内置函数close可以关闭channel,当channel关闭后,就不能再向channel写数据了,但是仍然可以从channel中读取数据。

一旦将channel关闭了,只能读不能写。相当于关闭管道就数据不能进入到队列里面了,只能进行读操作,只读不写。

channel支持for-range的方式进行遍历,请注意两个细节

(1)在遍历时,如果channel没有关闭,则回出现deadlock的错误

(2)在遍历时,如果channel已经关闭,则会正常遍历数据,遍历完后,就会退出遍历。

下面这种遍历方式肯定是错误的,每次取出来数据长度都会减1,容量方式也一样不是真实的长度,所以只能使用for rang方式。 

Golang channel的关闭_i++

func main() {
	intChan := make(chan int, 3)
	intChan <- 100
	intChan <- 200
	close(intChan) //关闭管道

	//当管道关闭之后,读取数据是没有问题的
	num := <-intChan
	fmt.Println(num)

	//从管道里面依次取出这样的值,管道是先进先出的队列,值也是按照顺序取出来的
	for v := range intChan {
		fmt.Println(v)
	}
}
func main() {
	intChan := make(chan int, 3)

	//向管道写入数据
	intChan <- 1
	num := 2
	intChan <- num

	for i := 0; i < 1; i++ {
		v, ok := <-intChan
		fmt.Println(v, ok)
	}

	fmt.Println(".....................")
	
    close(intChan)
	for i := 0; i < 10; i++ {
		v, ok := <-intChan
		fmt.Println(v, ok)
	}

}


1 true
.....................
2 true
0 false
0 false
0 false
0 false
0 false
0 false
0 false
0 false
0 false

标签:遍历,intChan,make,chan,Golang,关闭,channel
From: https://blog.51cto.com/u_14035463/9011167

相关文章

  • Golang秒读32GB大文件,如何读取?
    在Go中,处理大文件时,一般采用分块读取的方式,以避免一次性加载整个文件到内存中。以下是读取大文件的简洁步骤:1 打开文件: 使用os.Open打开文件。file, err := os.Open("largefile.txt")if err != nil {    log.Fatal(err)}defer file.Close()2 获取文件信息: 使用......
  • Golang基础(一)
    粗略了解Golang的核心特性Go语言的特性一、并发编程不同于传统的多进程或多线程,golang的并发执行单元是一种称为goroutine的协程。其在语言级别提供关键字:go——用于启动协程。chan——golang中用于并发的通道,用于协程的通信。select——golang提供的多路复用机制。close......
  • golang中汇编语义
    bito>TEXTmain.main(SB)D:/main.gomain.go:120xea7580493b6610CMPQ0x10(R14),SPmain.go:120xea75840f8691000000JBE0xea761bmain.go:120xea758a......
  • go-carbon v2.3.0 圣诞特别版发布,轻量级、语义化、对开发者友好的 Golang 时间处理库
    go-carbonv2.3.0圣诞节特别版发布,这应该是2023年的最后一个版本,祝大家圣诞节快乐!carbon是一个轻量级、语义化、对开发者友好的golang时间处理库,支持链式调用。目前已被awesome-go收录,如果您觉得不错,请给个star吧github.com/golang-module/carbongitee.com/golang-m......
  • golang 项目开发如何创建 Module
    golang项目开发如何创建Module原创 demo007x 知识派 2023-12-2208:30 发表于北京 听全文golang项目开发如何创建Moduleimg为什么要创建一个 Module?我们日常开发程序的时候都会引入第三方的 package,使用第三方的package的好处是我们可以快速的开发我们的......
  • nfs主机关闭后,客户端df -h卡死如何处理
    卡死[root@test~]#df-h^C直接卸载出现busy[root@localhost/]#umount/data1/imgumount:/data1/img:deviceisbusyumount:/data1/img:deviceisbusy无永久挂载[root@test~]#cat/etc/fstab[root@test~]#history|grepnfs531mount192.168.179.20:/nfs/nfs20......
  • Golang协程池ants
    官方示例packagemainimport( "fmt" "github.com/panjf2000/ants/v2" "sync" "sync/atomic" "time")varsumint32funcmyFunc(iinterface{}){ n:=i.(int32) atomic.AddInt32(&sum,n) fmt.Printf(&q......
  • vite自动关闭端口号插件
    关闭端口号插件❓:有时候我们需要强制将我们的端口号进行固定,......
  • 【Linux】CentOS防火墙操作:开启端口、开启、关闭、配置
    ......
  • Golang压测ws
    packagemainimport( "fmt" "log" "sync" "time" "github.com/gorilla/websocket")funcmain(){ //设置要压测的WebSocket服务地址 url:="ws://192.168.252.128:8080/" //设置并发请求数量 concurrency:=1......