go言語channelの別の使い方
12601 ワード
1.戻り値使用チャネル
2.パラメータ使用チャネル
3.同時循環
4.channelによる素数計算
5.共有変数の読み書き
私のベリーパイのブログアドレスにもアクセスできます.
http://www.codeforfun.info/
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/