11.1 channel

一、管道

  1. 协程之间的双向通道就是管道

  2. channel语法

    func worker(c chan int) {
    	for n := range c {
    		// n := <-c // 接收数据
    		fmt.Println(n)
    	}
    }
    
    func chanDemo() {
    	// var c chan int // c == nil
    	c := make(chan int)
    	// 创建了channel(管道)之后,需要有goroutine(协程)去接收,不然会造成死锁
    	go worker(c)
    	c <- 1 // 发送数据1,必须有人收,不然会死掉
    	c <- 2 // 发送数据2
    
    }

    注意:

    创建了channel(管道)之后,需要有goroutine(协程)去接收,不然会造成死锁

    接收数据,可以使用range接收,也可以直接赋值接收

    如果将函数提出,可以声明<-位置声明函数的功能

  3. buffered channel语法

    func bufferedChannel() {
    	c := make(chan int, 3) // 3表示缓冲区,可以缓冲3个数据
    
    	c <- 1
    	c <- 2
    	c <- 3
    }

    备注:添加缓存

  4. close

    func channelClose() {
    	c := make(chan int)
    	go worker(c)
    	c <- 1
    	c <- 2
    	close(c) // 关闭channel
    }

    注意:需要生产方关闭,如果不关闭,那么消费发放会一直接收,知道程序结束

  5. 理论基础:论文Communication Sequential Process(CSP)

  6. 不要通过共享内存来通信;通过通信来共享内存

Last updated

Was this helpful?