最近刚开始学习Go,学习Goroutine的时候很迷茫。这是我的代码。这打算同时完成3个过程。
package main
import (
"fmt"
"log"
"time"
)
func wait1(c chan string) {
time.Sleep(1 * time.Second)
log.Print("waited 1 sec")
c <- "wait1 finished\n"
}
func wait2(c chan string) {
time.Sleep(2 * time.Second)
log.Print("waited 2 sec")
c <- "wait2 finished\n"
}
func wait3(c chan string) {
time.Sleep(3 * time.Second)
log.Print("waited 3 sec")
c <- "wait3 finished\n"
}
func main() {
c := make(chan string, 3)
log.Print("started")
go wait1(c)
go wait2(c)
go wait3(c)
w1, w2, w3 := <-c, <-c, <-c
log.Print("finished")
fmt.Println(w1, w2, w3)
}
对我来说,这部分看起来将不同的函数输入到名为 c 的同一个通道中,并尝试打印从 c 接收到的值。
c := make(chan string, 3)
log.Print("started")
go wait1(c)
go wait2(c)
go wait3(c)
w1, w2, w3 := <-c, <-c, <-c
log.Print("finished")
fmt.Println(w1, w2, w3)
但是,如您所见,输出正是我所期望的。它同时处理 3 个函数并返回“完成”语句。
2015/11/25 09:41:31 started
2015/11/25 09:41:32 waited 1 sec
2015/11/25 09:41:33 waited 2 sec
2015/11/25 09:41:34 waited 3 sec
2015/11/25 09:41:34 finished
wait1 finished
wait2 finished
wait3 finished
为什么没有必要创建 3 个不同的通道,如 c1、c2、c3...?为什么即使我使用名为 c 的同一个通道,值也不会被覆盖?
郎朗坤
Qyouu
相关分类