0

Golang channel杂记


Channel

单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。

Go语言的并发模型是CSP,提倡通过通信共享内存而不是通过共享内存而实现通信。

channel是goroutine之前的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。

Go语言中的通道(channel)是一种特殊的类型(chan)。总是遵循先入先出的规则。

var b chan int // 需要指定通道中元素的类型

通道必须使用make函数初始化才能使用!

通道是引用类型,空值是nil

channel的操作

发送

// <-
ch1 <- 1

接收

// <-
<- ch1

关闭

close(ch1)
package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup

func main() {
	ch1 := make(chan int, 100)
	ch2 := make(chan int, 100)

	go func() {
		defer wg.Done()
		for i := 0; i < 100; i++ {
			ch1 <- i
		}
		close(ch1)
	}()

	go func() {
		defer wg.Done()

		for {
			x, ok := <- ch1
			if !ok {
				break
			}
			ch2 <- x * x
		}
		close(ch2)
	}()

	wg.Add(2)

	for {
		y, ok := <- ch2
		if !ok {
			break
		}
		fmt.Println("result", y)
	}
	close(ch2)

	wg.Wait()
}