go語言channel的別樣用法

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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://www.codeforfun.info/

 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.