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
}
}
}