golang中关于channel中的for range遍历操作

note: channel中若要使用for range进行遍历操作,channel必须首先要进行关闭操作的。
例一:

func main(){
	wg.Add(2)
	write := make(chan int, 5)
	read := make(chan int, 5)
	go writechan(write)
	go readchan(write, read)
	// 使用for range进行遍历的原因是该read channel 后面进行关闭了
	// 所以可以使用for range进行遍历操作
	for val := range read{
		fmt.Printf("main 为%d \n", val)
	}
	wg.Wait()
}

func writechan(ch chan int){
	for i:=0; i<100; i++{
		ch <- i
	}
	close(ch)
	wg.Done()
}

func readchan(write, read chan int){
	for val := range write{
		fmt.Printf("读出的数据为%d \n", val)
		read <- val
	}
	close(read)
	wg.Done()
}

例二:

package main

import "fmt"
// 从现有的通道中取数据
// 方法一: for 死循环
// 方法二: for range
func main(){
	data := make(chan int, 1000)
	cal := make(chan int, 2000)
	wg.Add(1)
	go Putdata(data)
	for i:=0; i<4; i++{
		wg.Add(1)
		go Getdata(data, cal)
	}
	// 等待所有的现程结束 关闭channel
	wg.Wait()
	close(cal)
	for val := range cal{
		fmt.Println(val)
	}
}

func Putdata(data chan int){
	defer wg.Done()
	for i:=1; i<=8000; i++{
		data <- i
	}
	close(data)
}

func Getdata(data, cal chan int){
	defer wg.Done()
	//  注意虽然是4个线程去取数据的, 每个线程的for range不一样
	// 但是还是可以使用for range的
	for num := range data{
		flag := true
		for i:=2; i<num; i++{
			if num % i == 0{
				flag = false
				break
			}
		}
		if flag{
			cal <- num
		}
	}
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值