Go言語基本文法(5) ~Goroutine, Channel~

Goroutine




Channel

package main

import "fmt"

func sum(s []int, c chan int) {
    sum := 0
    for _, v := range s {
        sum += v
    }
    c <- sum // send sum to c
}

func main() {
    s := []int{7, 2, 8, -9, 4, 0}

    c := make(chan int)
    go sum(s[:len(s)/2], c)
    go sum(s[len(s)/2:], c)
    x, y := <-c, <-c // receive from c

    fmt.Println(x, y, x+y)
    // 17 -5
}

Buffered Channels

package main

import "fmt"

func main() {
    ch := make(chan int, 2)
    ch <- 1
    ch <- 2
    fmt.Println(<-ch)
    // 1
    fmt.Println(<-ch)
    // 2
}
package main

import (
    "fmt"
)

func fibonacci(n int, c chan int) {
    x, y := 0, 1
    for i := 0; i < n; i++ {
        c <- x
        x, y = y, x+y
    }
    // c にこれ以上は送信しないことを示す
    close(c)
}

func main() {
    c := make(chan int, 5)
    go fibonacci(cap(c), c)
    for i := range c {
        fmt.Println(i)
    }
    // 0
    // 1
    // 1
    // 2
    // 3
}

select




参考

A Tour of Go