一、go routine channel
package main
import (
"fmt"
"time"
)
func worker(id int, c chan int) {
for n := range c {//读取channel
fmt.Printf("Worker %d received %c\n",
id, n)
}
}
func createWorker(id int) chan<- int {
c := make(chan int)
go worker(id, c)//routine,可以理解为新开线程
return c
}
func chanDemo() {
var channels [10]chan<- int
for i := 0; i < 10; i++ {
channels[i] = createWorker(i)
}
for i := 0; i < 10; i++ {
channels[i] <- 'a' + i//向channel中写入数据
}
for i := 0; i < 10; i++ {
channels[i] <- 'A' + i
}
time.Sleep(time.Second)//主线程也是个runtine
}
func bufferedChannel() {
c := make(chan int, 3)
go worker(0, c)
c <- 'a'
c <- 'b'
c <- 'c'//如果没有人接收,可以在缓冲区存放3个,发送第四个时候会阻塞;如果make(chan int),如果没有人接收,在发送第二个时候,就会阻塞。
c <- 'd'
time.Sleep(time.Millisecond)
}
func channelClose() {
c := make(chan int)
go worker(0, c)
c <- 'a'
c <- 'b'
c <- 'c'
c <- 'd'
close(c)//关闭channel后不能发送和接收数据了
time.Sleep(time.Second * 20)
}
func main() {
fmt.Println("Channel as first-class citizen")
chanDemo()
//fmt.Println("Buffered channel")
//bufferedChannel()
//fmt.Println("Channel close and range")
//channelClose()
}
输出:
Worker 0 received a
Worker 1 received b
Worker 2 received c
Worker 3 received d
Worker 4 received e
Worker 4 received E
Worker 0 received A
Worker 7 received h
Worker 2 received C
Worker 9 received j
Worker 1 received B
Worker 6 received g
Worker 3 received D
Worker 8 received i
Worker 5 received f
Worker 5 received F
Worker 8 received I
Worker 6 received G
Worker 7 received H
Worker 9 received J
go runtine可以理解为新开个线程,不过实际上很多runtime可以运行在一个线程中,由go虚拟机去调度。
go channel是为了不同go runtine间通信而设置的。
1、发送channel后,只