Loading

Golang channel【管道】的关闭和遍历

一:channel的关闭

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

代码案例:

package main

import "fmt"

func main() {
	iniChan := make(chan int, 3)
	iniChan <- 100
	iniChan <- 200
	close(iniChan)
	//这时不能再写入数据
	// iniChan <- 300
	fmt.Println("ok")
	//当管道关闭后,读取数据是可以的
	n1 := <-iniChan
	fmt.Println("n1=", n1)
}

二:channel的遍历

channel支持for-range的方式进行遍历

  • 在遍历时,如果channel没有关闭,则会出现deadlock的错误
  • 在遍历时,如果channel已经关闭,则正常遍历数据,遍历完后,就会退出遍历

代码案例:

package main

import "fmt"

func main() {
	iniChan := make(chan int, 3)
	iniChan <- 100
	iniChan <- 200
	close(iniChan)
	//这时不能再写入数据
	// iniChan <- 300
	fmt.Println("ok")
	//当管道关闭后,读取数据是可以的
	n1 := <-iniChan
	fmt.Println("n1=", n1)
	//给管道存放100个数据
	iniChan2 := make(chan int, 100)
	for i := 0; i < 100; i++ {
		iniChan2 <- i * 2
	}
	close(iniChan2) //关闭管道,否则会死锁,直接报错 deadlock
	//遍历管道【不能使用普通的for循环】
	for v := range iniChan2 {
		fmt.Println("v=", v)
	}
}

 

posted @ 2024-10-11 16:51  Carver大脸猫  阅读(21)  评论(0)    收藏  举报