一、channel
1.定义channel类型
var c chan int
c1 := make(chan int)
c2 := make(chan int, 3)
2.向channel发数据
var c chan int
c <- 1
3.从channel收数据
var c chan int
n := <-c
二、channel基本操作
1.向channel收发数据
func chanDemo1() {
c := make(chan int)
go func() {
for {
fmt.Println("Receive data from channel: ", <-c)
}
}()
c <- 1
c <- 2
// time.Sleep(time.Millisecond)
}
2.chanel作为参数
func worker(c chan int) {
for {
n := <-c
fmt.Println("Receive data from channel: ", n)
}
}
func chanDemo2() {
c := make(chan int)
go worker(c)
c <- 1
c <- 2
time.Sleep(time.Millisecond)
}
func main() {
chanDemo2()
}
3.channel作为数组类型
func worker(id int, c chan int) {
for {
n := <-c
fmt.Printf("worker %d received %c\n", id, n)
}
}
func chanDemo3() {
var channels [10]chan int
for i := 0; i < 10; i++ {
channels[i] = make(chan int)
go worker(i, channels[i])
}
for i := 0; i < 10; i++{
channels[i] <- 'a' + i
}
for i := 0; i < 10; i++{
channels[i] <- 'A' + i
}
time.Sleep(time.Millisecond)
}
func main() {
chanDemo3()
}
4.channel作为返回值
func chanDemo1() {
c := make(chan int)
go func() {
for {
fmt.Println("Receive data from channel: ", <-c)
}
}()
c <- 1
c <- 2
// time.Sleep(time.Millisecond)
}
func createWorker(id int) chan int{
c := make(chan int)
go func() {
for {
n := <-c
fmt.Printf("worker %d received %c\n", id, n)
}
}()
return c
}
func chanDemo4() {
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
}
for i := 0; i < 10; i++{
channels[i] <- 'A' + i
}
time.Sleep(time.Millisecond)
}
func main() {
chanDemo4()
}
5.buffered channel
func worker(id int, c chan int) {
for {
n, ok := <-c
if !ok {
break
}
fmt.Printf("worker %d received %d\n", id, n)
}
}
func bufferedChannel() {
c := make(chan int, 3)
go worker(0, c)
c <- 1
c <- 2
c <- 3
c <- 4
close(c)
time.Sleep(time.Millisecond)
}
func main() {
bufferedChannel()
}
6.range
func worker(id int, c chan int) {
for n := range c {
fmt.Printf("worker %d received %d\n", id, n)
}
}
func bufferedChannel() {
c := make(chan int, 3)
go worker(0, c)
c <- 1
c <- 2
c <- 3
c <- 4
close(c)
time.Sleep(time.Millisecond)
}
func main() {
bufferedChannel()
}
理论基础:Communication Sequential Process(CSP)
不要通过共享内存来通信;通过通信来共享内存