go语言channel的别样用法

1.返回值使用通道

func main() {    // 生成随机数作为一个服务
    randService := randGenerator()    // 从服务中读取随机数并打印
    fmt.Printf("%d\n",<-randService)
}
func randGenerator() chan int {    // 创建通道
    out := make(chan int)    // 创建协程    go func() {        for {            //向通道内写入数据,如果无人读取会等待
            out <- rand.Int()
        }
    }()    return out}

2.参数使用通道

//一个查询结构体type query struct {    //参数Channel
    sql chan string
    //结果Channel
    result chan string}//执行Queryfunc execQuery(q query) {    //启动协程    go func() {        //获取输入
        sql := <-q.sql        //访问数据库,输出结果通道
        q.result <- "get" + sql
    }()
}
func main() {    //初始化Query
    q := query{make(chan string, 1),make(chan string, 1)}    //执行Query,注意执行的时候无需准备参数    execQuery(q)    //准备参数
    q.sql <- "select * from table"
    //获取结果
    fmt.Println(<-q.result)
}

3.并发循环

func doSomething(num int) (sum int) {    for i := 1; i <= 10; i++ {
        fmt.Printf("%d + %d = %d\n", num, num + i, num + num + i)
        sum = sum + num + i
    }    return sum
}
func testLoop() {    // 建立计数器,通道大小为cpu核数
    var NumCPU = runtime.NumCPU()
    fmt.Printf("NumCPU = %d\n", NumCPU)
    sem :=make(chan int, NumCPU);    //FOR循环体
    data := []int{1, 11, 21, 31, 41, 51, 61, 71, 81, 91}    for _,v:= range data {        //建立协程
        go func (v int) {
            fmt.Printf("doSomething(%d)...\n", v)
            sum := doSomething(v);            //计数
            sem <- sum;
        } (v);
    }    // 等待循环结束
    var total int = 0
    for i := 0; i < len(data); i++ {
        temp := <- sem
        fmt.Printf("%d <- sem\n", temp)
        total = total + temp
    }
    fmt.Printf("total = %d\n", total)
}
func main() {
    testLoop()
}

4.利用channel计算素数

// Send the sequence 2, 3, 4, ... to channel 'in'.func Generate(ch chan int) {    for i := 2; ; i++ {
        ch<- i // Send 'i' to channel 'in'.    }
}// Copy the values from channel 'in' to channel 'out',// removing those divisible by 'prime'.func Filter(in chan int, out chan int, prime int) {    for {
        i := <-in // Receive valuefrom 'in'.
        if i%prime != 0 {            out <- i // Send'i' to 'out'.        }
    }
}
func main() {    in := make(chan int)
    go Generate(in)      // Launch Generate goroutine.
    for i := 0; i < 100; i++ {
        prime := <-in
        print(prime, "\n")        out := make(chan int)
        go Filter(in, out, prime)        in = out
    }
}

5.共享变量的读写

//共享变量有一个读通道和一个写通道组成type shardedVar struct {
    reader chan int
    writer chan int}//共享变量维护协程func whachdog(v shardedVar) {
    go func() {        //初始值
        var value int = 0
        for {            //监听读写通道,完成服务
            select {            case value = <-v.writer:            case v.reader <-value:
            }
        }
    }()
}
func main() {    //初始化,并开始维护协程
    v := shardedVar{make(chan int), make(chan int)}
    whachdog(v)    //读取初始值
    fmt.Println(<-v.reader)    //写入一个值
    v.writer <- 1
    //读取新写入的值
    fmt.Println(<-v.reader)
}

转自:http://studygolang.com/articles/609