go言語channelの別の使い方

12601 ワード

1.戻り値使用チャネル
func main() {

    //            

    randService := randGenerator()

    //             

    fmt.Printf("%d
",<-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

}

//  Query

func 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
", num, num + i, num + num + i) sum = sum + num + i } return sum } func testLoop() { // , cpu var NumCPU = runtime.NumCPU() fmt.Printf("NumCPU = %d
", 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)...
", v) sum := doSomething(v); // sem <- sum; } (v); } // var total int = 0 for i := 0; i < len(data); i++ { temp := <- sem fmt.Printf("%d <- sem
", temp) total = total + temp } fmt.Printf("total = %d
", 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, "
") 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/