传送channel的通道
用 chSquare.go
代码来说明传递channel的通道的使用,分为四个部分来介绍。
chSquare.go
的第一部分如下:
package main
import (
"fmt"
"os"
"strconv"
"time"
)
var times int
声明一个常规的 int
通道,您把它发送给传递通道的通道变量。然后您使用 select
表达式从常规的 int
通道读取数据和使用 f
信号通道来退出函数。
一旦您从 c
通道读取了信号值,便开始了一个 for
循环来计算从 0
到信号值的所有整数之和。接下来,您发送这个计算值给 通道,执行结束。
chSquare.go
的第三部分如下:
func main() {
if len(arguments) != 2 {
fmt.Println("Need just one integer argument!")
return
}
times, err := strconv.Atoi(arguments[1])
if err != nil {
fmt.Println(err)
return
}
chSquare.go
的其他代码如下:
通道是一个信号通道,用来当真正的工作完成时结束 goroutine。ch := <-cc
表达式允许您从传递通道的通道获得一个常规的通道,使用 ch <-i
发送一个 int
值给它。之后,您使用 for
循环从它读取数据。尽管 f1()
函数编写为发送一个值回来,但您也可以读取多个值。注意 i
的每个值都被不同的 goroutine 执行。
信号通道的类型可以是任何您想要的类型,包括上面用到的 bool
和下节要用到的 struct{}
类型的信号通道。一个 struct{}
信号通道的优点是不能发送数据给它,这能减少错误和错误的想法。
$go run chSquare.go 4
Sum(1)=1
Sum(2)=3
Sum(3)=6
Sum(4)=10
$go run chSquare.go 6
Sum(1)=1
Sum(2)=3
Sum(3)=6
Sum(4)=10