zoukankan      html  css  js  c++  java
  • golang 13. 管道 channel

    channel1.go

    package main
    
    import "fmt"
    
    func main() {
    	//定义一个channel
    	c := make(chan int)
    
    	go func() {
    		defer fmt.Println("goroutine结束")
    
    		fmt.Println("goroutine 正在运行...")
    
    		c <- 666 //将666 发送给c
    	}()
    
    	num := <-c //从c中接受数据,并赋值给num
    
    	fmt.Println("num = ", num)
    	fmt.Println("main goroutine 结束...")
    }
    

    channel2.go

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	c := make(chan int, 3) //带有缓冲的channel
    
    	fmt.Println("len(c) = ", len(c), ", cap(c)", cap(c))
    
    	go func() {
    		defer fmt.Println("子go程结束")
    
    		for i := 0; i < 4; i++ {
    			c <- i
    			fmt.Println("子go程正在运行, 发送的元素=", i, " len(c)=", len(c), ", cap(c)=", cap(c))
    		}
    	}()
    
    	time.Sleep(2 * time.Second)
    
    	for i := 0; i < 4; i++ {
    		num := <-c //从c中接收数据,并赋值给num
    		fmt.Println("num = ", num)
    	}
    
    	fmt.Println("main 结束")
    }
    

    channel3.go

    package main
    
    import "fmt"
    
    func main() {
    	c := make(chan int)
    
    	go func() {
    		for i := 0; i < 5; i++ {
    			c <- i
    			//close可以关闭一个channel
    			close(c)
    		}
    	}()
    
    	for {
    		//ok如果为true表示channel没有关闭,如果为false表示channel已经关闭
    		if data, ok := <-c; ok {
    			fmt.Println(data)
    		} else {
    			break
    		}
    	}
    
    	fmt.Println("Main Finished..")
    }
    

    channel4.go

    package main
    
    import "fmt"
    
    func main() {
    	c := make(chan int)
    
    	go func() {
    		for i := 0; i < 5; i++ {
    			c <- i
    		}
    
    		//close可以关闭一个channel
    		close(c)
    	}()
    
    	//可以使用range来迭代不断操作channel
    	for data := range c {
    		fmt.Println(data)
    	}
    
    	fmt.Println("Main Finished..")
    }
    

    channel5.go

    package main
    
    import "fmt"
    
    func fibonacii(c, quit chan int) {
    	x, y := 1, 1
    
    	for {
    		select {
    		case c <- x:
    			//如果c可写,则该case就会进来
    			x = y
    			y = x + y
    		case <-quit:
    			fmt.Println("quit")
    			return
    		}
    	}
    }
    
    func main() {
    	c := make(chan int)
    	quit := make(chan int)
    
    	//sub go
    	go func() {
    		for i := 0; i < 10; i++ {
    			fmt.Println(<-c)
    		}
    
    		quit <- 0
    	}()
    
    	//main go
    	fibonacii(c, quit)
    }
    
  • 相关阅读:
    IBinder在进程之间传递一个对象的形式(一)
    Xaml在string(串)定义常量和处理空间
    c 有意思的数组初始化
    C 文件直接包含
    [面试技巧]16个经典面试问题回答思路
    centos6安装bt工具transmission
    clearcase 中一些概念和操作
    C/C++ Resources
    Linux I/O 重定向详解及应用实例
    c/c++ 直接使用动态库 dlopen
  • 原文地址:https://www.cnblogs.com/dech/p/14941514.html
Copyright © 2011-2022 走看看