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)
    }
    
  • 相关阅读:
    Crash dump中需要重点关注的信息
    导致性能问题的常见情况
    关于性能调优
    通过jdt解析spring mvc中url-类-方法的对应关系
    springcloud zuul
    spring中实现自己的初始化逻辑
    nginx配置文件解析工具
    mac 识别压缩文件类型
    使用JDT转java代码为AST
    word中插入的代码库设置局部背景色
  • 原文地址:https://www.cnblogs.com/dech/p/14941514.html
Copyright © 2011-2022 走看看