package main
import"fmt"funcmain(){
data:=make(chanint,10)
flag :=make(chanbool,1)gowrite(data)goread(data, flag)// 这块也是可以使用 sync.WaitGroup来进行实现的for{// 能够正常取出数据就是ok 否则是falseif_, ok :=<-flag;!ok{break}}
fmt.Println("程序运行结束")}funcread(ch <-chanint, flag chan<-bool){for{
data, ok :=<-ch
if!ok{break}
fmt.Println("读出的数据为:",data)}
flag <-true// 这块也是应该将flag的这个channel进行关闭操作的close(flag)}funcwrite(ch chan<-int){for i:=0; i<50; i++{
ch <- i
fmt.Println("写入数据:", i)}// 最后一定要进行channel的关闭// 因为数据已经写入完成close(ch)}
2. 示例二
package main
import("fmt""sync")var(
wg sync.WaitGroup
)funcmain(){
data :=make(chanint,200)
res :=make(chanint,200)
wg.Add(1)goputData(data)for i:=0; i<4; i++{
wg.Add(1)goacl(data, res)}// 注意不能再这close 掉res// close(res)
wg.Wait()// 应该再这进行close的操作的close(res)for i:=range res{
fmt.Println("打印的数据:", i)}
fmt.Println("main函数结束了")}funcacl(data chanint, res chanint){for{
tem, ok :=<-data
if!ok{break}
res <- tem*tem
}
wg.Done()}funcputData(data chan<-int){for i:=1; i<500; i++{
data <- i
}close(data)
wg.Done()}package main
import("fmt""sync")var(
wg sync.WaitGroup
)funcmain(){
data :=make(chanint,20)
res :=make(chanint,500)
wg.Add(1)goputData(data)for i:=0; i<4; i++{
wg.Add(1)goacl(data, res)}// 注意不能再这close 掉res// close(res)
wg.Wait()// 应该再这进行close的操作的close(res)for i:=range res{
fmt.Println("打印的数据:", i)}
fmt.Println("main函数结束了")}funcacl(data chanint, res chanint){for{
tem, ok :=<-data
if!ok{break}// 这里面的res的大小一定要是500 // 因为这个channel是没有读数据的 // 只有写数据的
res <- tem*tem
}
wg.Done()}funcputData(data chan<-int){for i:=1; i<500; i++{
data <- i
}close(data)
wg.Done()}