传送channel的通道

    chSquare.go 代码来说明传递channel的通道的使用,分为四个部分来介绍。

    chSquare.go 的第一部分如下:

    1. package main
    2. import (
    3. "fmt"
    4. "os"
    5. "strconv"
    6. "time"
    7. )
    8. var times int

    声明一个常规的 int 通道,您把它发送给传递通道的通道变量。然后您使用 select 表达式从常规的 int 通道读取数据和使用 f 信号通道来退出函数。

    一旦您从 c 通道读取了信号值,便开始了一个 for 循环来计算从 0 到信号值的所有整数之和。接下来,您发送这个计算值给 通道,执行结束。

    chSquare.go 的第三部分如下:

    1. func main() {
    2. if len(arguments) != 2 {
    3. fmt.Println("Need just one integer argument!")
    4. return
    5. }
    6. times, err := strconv.Atoi(arguments[1])
    7. if err != nil {
    8. fmt.Println(err)
    9. return
    10. }

    chSquare.go 的其他代码如下:

    通道是一个信号通道,用来当真正的工作完成时结束 goroutine。ch := <-cc 表达式允许您从传递通道的通道获得一个常规的通道,使用 ch <-i 发送一个 int 值给它。之后,您使用 for 循环从它读取数据。尽管 f1() 函数编写为发送一个值回来,但您也可以读取多个值。注意 i 的每个值都被不同的 goroutine 执行。

    信号通道的类型可以是任何您想要的类型,包括上面用到的 bool 和下节要用到的 struct{} 类型的信号通道。一个 struct{} 信号通道的优点是不能发送数据给它,这能减少错误和错误的想法。

    1. $go run chSquare.go 4
    2. Sum(1)=1
    3. Sum(2)=3
    4. Sum(3)=6
    5. Sum(4)=10
    6. $go run chSquare.go 6
    7. Sum(1)=1
    8. Sum(2)=3
    9. Sum(3)=6
    10. Sum(4)=10