go 基础chan
管道 chan
func main() {
numchan := make(chan int)
go func() {
for i:=0;i<20;i++{
numchan <- i
fmt.Println("写入数据:",i)
}
close(numchan)
}()
//管道通过range遍力,只返回一个值
//for range是不知道写入完成,所以会一直等待
//在写入端,将管道关闭,for range遍历关闭的管道时会退出
for v:= range numchan{
fmt.Println("读取数据:", v)
}
numchan2 := make(chan int,10)
go func() {
for i:=0;i<20;i++{
numchan2 <-i
fmt.Println("写入数据",i)
}
close(numchan2)
}()
//判断管道是否关闭
for{
v,ok := <-numchan2
if !ok{
fmt.Println("管道已经关闭,准备退出")
break
} else {
fmt.Println("读取数据",v)
}
}
}
//、单向通道
func main() {
numchan := make(chan int,10)
go produce(numchan)
go consumer(numchan)
time.Sleep(2*time.Second)
}
func produce(out chan <- int) {
//生产者,往管道里面写数据
for i:=0;i<30;i++{
out <- i
fmt.Println("往管道里面写数据",i)
}
}
func consumer(in <- chan int) {
for v:= range in{
fmt.Println("读取数据",v)
}
}