zoukankan      html  css  js  c++  java
  • Go-通道(channel)学习

    通道(channel)

    声明、初始化

    1.无缓冲通道

    func writeInteger(ch chan int){
     	ch<- 110
    }
    
    var ch1 chan int // ch1 == nil 不能直接使用
    
    ch1 = make(chan int) // 无缓冲通道(初始化时,第二个参数为空或0);写入之前,先准备好接收(读取)。注:写入与读取放到2个不同的goroutine,否则造成阻塞。
    
    go writeInteger(ch1) // 新goroutine进行写入操作
    
    fmt.Println(<-ch1) // 110
    
    

    2.缓冲通道

    // 缓冲通道,当写入次数达到容量时,若不进行读取操作,就会阻塞。
    ch2 := make(chan string, 1) // 初始化时,第二个参数(容量)大于0
    
    
    ch2<- "hello"
    ch2<- "world" // 程序阻塞
    fmt.Println(<-ch2)
    
    // 注:处理这种情况,要每写入一次且读取一次
    // 即:
    ch2<- "hello"
    fmt.Println(<-ch2)
    ch2<- "world"
    fmt.Println(<-ch2)
    

    通道遍历

    import "fmt"
    
    func fibonacci(mychan chan int) {
        n := cap(mychan)
        x, y := 1, 1
        for i := 0; i < n; i++ {
            mychan <- x
            x, y = y, x+y
        }
        // 记得 close 信道
        // 不然主函数中遍历完并不会结束,而是会阻塞。
        close(mychan)
    }
    
    func main() {
        pipline := make(chan int, 10)
    
        go fibonacci(pipline)
    
      	// 在range时,要确保通道是处于"关闭状态",否则循环会阻塞。
        for k := range pipline {
            fmt.Println(k)
        }
    }
    
  • 相关阅读:
    【matlab】学习笔记 2脚本编写
    【matlab】学习笔记 1 入门简单操作
    【matlab】学习笔记 3 函数编写
    MySQL学习笔记
    数据库连接-----MySQL -> JDBC
    leetcode——Mysql数据库查询题目
    不同单词个数统计
    初始化二维数组
    JS基本变量类型和对象杂谈
    LeetCode Clone Graph
  • 原文地址:https://www.cnblogs.com/mustard22/p/12935477.html
Copyright © 2011-2022 走看看