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)
    }
    
  • 相关阅读:
    SQL Server 快速大数据排序方法
    RGB颜色名称与色值对应表
    Visual Studio 2017 Android 调试无法连接到虚拟机
    sqlite 使用 cte 及 递归的实现示例
    C# 判断文件编码
    SQL点点滴滴_SQL分页查询
    SQL点点滴滴_判断字段或者字符中是否包含有特殊字符
    SQL点点滴滴_公用表表达式(CTE)递归的生成帮助数据
    【Oracle】Update方法
    SQL点点滴滴_DELETE小计
  • 原文地址:https://www.cnblogs.com/dech/p/14941514.html
Copyright © 2011-2022 走看看