package main
import("fmt")funcmain02(){
ch :=make(chanint)gofunc(){for i :=0; i <5; i++{
fmt.Println("子go程, i=", i)
ch <- i // ch <- 0}}()//time.Sleep(time.Second * 2)for i :=0; i <5; i++{
num :=<-ch
fmt.Println("主go程读:", num)}}
3.有缓冲的channel
package main
import("fmt")funcmain03(){
ch :=make(chanint,5)// 存满3个元素之前,不会阻塞
fmt.Println("len=",len(ch),"cap=",cap(ch))gofunc(){for i :=0; i <10; i++{
ch <- i
len:=len(ch)cap:=cap(ch)
fmt.Println("子go程:i", i,"len=",len,"cap=",cap)//fmt.Println("子go程:i", i)}}()//time.Sleep(time.Second * 3)for i :=0; i <8; i++{
num :=<-ch
fmt.Println("主go程读到:", num)}}
4.关闭channel
package main
import("fmt""time")/*func main() {
ch := make(chan int)
go func() {
for i:=0; i<8;i++ {
ch <- i
}
close(ch) // 写端,写完数据主动关闭channel
//ch <- 790
}()
for {
if num, ok := <- ch; ok == true {
fmt.Println("读到数据:", num)
} else {
n := <- ch
fmt.Println("关闭后:", n)
break
}
}
}*/funcmain04(){
ch :=make(chanint,0)gofunc(){for i :=0; i <5; i++{
ch <- i
}close(ch)// 写端,写完数据主动关闭channel//ch <- 790
fmt.Println("子go 结束")}()
time.Sleep(time.Second *2)/* for {
if num, ok := <- ch; ok == true {
fmt.Println("读到数据:", num)
} else {
n := <- ch
fmt.Println("关闭后:", n)
break
}
}*/for num :=range ch {
fmt.Println("读到数据:", num)}}
5.单向channel
package main
import"fmt"/*func main() {
ch := make(chan int) // 双向channel
var sendCh chan <- int = ch
sendCh <- 789
//num := <- sendCh
var recvCh <- chan int = ch
num := <-recvCh
fmt.Println("num=", num)
// 反向赋值
//var ch2 chan int = recvCh
}*/funcsend(out chan<-int){
out <-89close(out)}funcrecv(in <-chanint){
n :=<-in
fmt.Println("读到", n)}funcmain0500(){
ch :=make(chanint)// 双向channelgofunc(){send(ch)// 双向channel 转为 写channel}()recv(ch)}
6.生产者消费者模型
package main
import("fmt""time")funcproducer(out chan<-int){for i :=0; i <10; i++{
fmt.Println("生产:", i*i)
out <- i * i
}close(out)}funcconsumer(in <-chanint){for num :=range in {
fmt.Println("消费者拿到:", num)
time.Sleep(time.Second)}}funcmain06(){
ch :=make(chanint,6)goproducer(ch)// 子go程 生产者consumer(ch)// 主go程 消费}
package main
import("fmt""runtime""time")funcmain09(){
ch :=make(chanint)// 用来进行数据通信的 channel
quit :=make(chanbool)// 用来判断是否退出的 channel//ch2 := make(chan string)gofunc(){// 写数据for i :=0; i <5; i++{
ch <- i
time.Sleep(time.Second)}close(ch)
quit <-true// 通知主go程 退出
runtime.Goexit()}()for{// 主go程 select 监听 chan数据流动select{case num :=<-ch:// 不可读,阻塞。可以读,将数据保存至num
fmt.Println("读到:", num)// 模拟使用数据case<-quit:// 不可读,阻塞。可以读,将主go程结束。//break // break 跳出 select 不可用//runtime.Goexit() // 终止 主 go 程 不可用return// 终止进程}
fmt.Println("============")// select 自身不带有循环机制,需借助外层 for 来循环监听}}
10.select实现斐波那数列
package main
import("fmt""runtime")funcfibonacci(ch <-chanint, quit <-chanbool){for{select{case num :=<-ch:
fmt.Print(num," ")case<-quit://return
runtime.Goexit()//等效于 return}}}funcmain(){
ch :=make(chanint)
quit :=make(chanbool)gofibonacci(ch, quit)// 子go 程 打印fibonacci数列
x, y :=1,1for i :=0; i <40; i++{
ch <- x
x, y = y, x+y
}
quit <-true}