Skip to content

Instantly share code, notes, and snippets.

@bingohuang
Created December 19, 2016 03:40
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bingohuang/27208e58e4631fa2b820ba6bfa482368 to your computer and use it in GitHub Desktop.
Save bingohuang/27208e58e4631fa2b820ba6bfa482368 to your computer and use it in GitHub Desktop.
Go语言并发编程实例-1
package main
import (
"fmt"
"math/rand"
"sync"
)
func main() {
numberChan1 := make(chan int64, 3) // 数字通道1。
numberChan2 := make(chan int64, 3) // 数字通道2。
numberChan3 := make(chan int64, 3) // 数字通道3。
var waitGroup sync.WaitGroup // 用于等待一组操作执行完毕的同步工具。
waitGroup.Add(3) // 该组操作的数量是3。
go func() { // 数字过滤装置1。
for n := range numberChan1 { // 不断的从数字通道1中接收数字,直到该通道关闭。
if n%2 == 0 { // 仅当数字可以被2整除,才将其发送到数字通道2.
numberChan2 <- n
} else {
fmt.Printf("Filter %d. [filter 1]\n", n)
}
}
close(numberChan2) // 关闭数字通道2。
waitGroup.Done() // 表示一个操作完成。
}()
go func() { // 数字过滤装置1。
for n := range numberChan2 { // 不断的从数字通道1中接收数字,直到该通道关闭。
if n%5 == 0 { // 仅当数字可以被2整除,才将其发送到数字通道2.
numberChan3 <- n
} else {
fmt.Printf("Filter %d. [filter 2]\n", n)
}
}
close(numberChan3) // 关闭数字通道2。
waitGroup.Done() // 表示一个操作完成。
}()
go func() { // 数字输出装置。
for n := range numberChan3 { // 不断的从数字通道3中接收数字,直到该通道关闭。
fmt.Println("Out:", n) // 打印数字。
}
waitGroup.Done() // 表示一个操作完成。
}()
for i := 0; i <= 100; i++ { // 先后向数字通道1传送100个范围在[0,100)的随机数。
numberChan1 <- rand.Int63n(100)
//numberChan1 <- (int64)(i)
}
close(numberChan1) // 数字发送完毕,关闭数字通道1。
waitGroup.Wait() // 等待前面那组操作(共3个)的完成。
}
@sniperyen
Copy link

谢谢,浅显易懂,对go并发有了浅显了解

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment