您的当前位置:首页正文

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

2024-11-30 来源:个人技术集锦

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
		}
	}
}
显示全文