从一个简单的案例入手,不断发现问题,解决问题,由浅入深,循序渐进,轻松学习go语言。
我们先写一个简单的并发,子协程作为生产者生产数据,主线程作为消费者接收数据。
// gochan_1.go
package main
import (
"fmt"
)
func producer(ch chan int) {
for i := 0; i < 5; i++ {
ch <- i
}
close(ch)
}
func main() {
ch := make(chan int)
go producer(ch)
for i := 0; i < 5; i++ {
num := <-ch
fmt.Println("num=", num)
}
fmt.Println("game over!")
}
运行go run gochan_1.go
num= 0 num= 1 num= 2 num= 3 num= 4 game over!
这就是一个简单的并发,这个程序没有什么技术含量。我们继续拓展程序的难度。
因为这里的生产者和消费者都是确定的生产和消费5个数据。我们假设消费者不知道生产了多少数据,但是我们一样要全部接收过来,怎么办呢?两个办法
1.if num,ok:=<-ch;ok
2.for num:=range ch
分别试一下。
// gochan_1.go
package main
import (
"fmt"
)
func producer(ch chan int) {
for i := 0; i < 5; i++ {
ch <- i
}
close(ch)
}
func main() {
ch := make(chan int)
go producer(ch)
for {
if num, ok := <-ch; ok {
fmt.Println("num=", num)
} else {
break
}
}
fmt.Println("game over!")
}
输出结果不变。
继续使用第二种模式
// gochan_1.go
package main
import (
"fmt"
)
func producer(ch chan int) {
for i := 0; i < 5; i++ {
ch <- i
}
close(ch)
}
func main() {
ch := make(chan int)
go producer(ch)
for num := range ch {
fmt.Println("num=", num)
}
fmt.Println("game over!")
}
输出仍然没有变化,但是代码简洁了不少。这是消费者的改造者。
由于篇幅所限,我们下一期继续改造生产者,一定会大有不同。