美文网首页
go的通道

go的通道

作者: 蛐蛐儿阳 | 来源:发表于2020-05-03 14:04 被阅读0次

注: 本笔记是自己的学习笔记,都是自己的理解,而不是教学文章,要学习请自行阅读 图书 --- Go程序设计语言
goroutine 很好理解了,就是并发的执行体。 多协成的执行一段代码。
而通道是一个 go 发送到另一个go的通信机制。 每一个通道也都有类型,叫通道的元素类型。 一个有int类型的元素写为

chan int

创建通道用make

ch := make(chan int)

通道分发送和接收,通道和值分别在<-的左右两边

ch <-  x  // 发送语句
ch是通道, x是值。
通道 ch 发送x值

x = <-ch // 
<-ch // 接收语句

注意 通道ch 在左边就是发送语句,在右边就是接收语句。
当通道接收值时, 就是 <-ch 的时候, 其接收的结果是非必须值
x = <-ch // x是接收结果
<-ch    // 通道接收值, 丢弃结果

close(ch)  // 关闭通道
用完记得关闭

make可以接收第二个参数, 表示通道容量, 为0或不传值时,是无缓冲通道

ch = make(chan int) // 无缓冲通道
ch = make(chan int, 0) // 无缓冲通道
ch = make(chan int, 3) // 容量为3的缓冲通道

无缓冲通道,我的理解,简单说,A端发送,B端接收。
1,A发送了,没有接收,A会阻塞,就是卡住了。
2,B接收了,没有收到消息, B也会卡住,等待传值。
这里理解的不对。准确的说是从一个没有值的通道获取,会卡住。
但从一个已关闭的通道获取值,有值则获取,没值会活取类型空值。
3, A发送了,B接收了。 然后A,B,都继续干自己的活。
通道并不是A脚本和B脚本通信, 他们通常在同一段代码中, 只不过go 后面的函数, 是多协成,会同时执行, 通道是他们之间通信。
通道好多时候更像一个数组。

管道: 一个输出是另一个的输入。

package main

import (
    "fmt"
    _"log"
)

func main()  {
    naturals := make(chan int)
    squares := make(chan int)

    go func() {
        // 这里没有条件 会无限循环下去
        // 这段代码能把你电脑跑死,所以我添加了x的条件
        for x := 0; x < 3; x++ {
            naturals <- x
        }
    }()

    // 这小括号是匿名函数输入参数值
    // 必须写上 不然报错
    go func() {
        for {
            x := <-naturals
            squares <- x * x
        }
    }()

    for  {
        fmt.Printf("<-squares = ")
        fmt.Println(<-squares)
    }
}

在得到0,1,4后报错了。
可以把通道看出数组,用for range, 用完记得关闭

package main

import (
    "fmt"
    _ "log"
)

func main()  {
    naturals := make(chan int)
    squares := make(chan int)

    go func() {
        // 这里没有条件 会无限循环下去
        // 这段代码能把你电脑跑死,所以我添加了x的条件
        for x := 0; x < 3; x++ {
            naturals <- x
        }
        close(naturals)
    }()

    // 这小括号是匿名函数输入参数值
    // 必须写上 不然报错
    go func() {
        for x := range naturals{
            squares <- x * x
        }
        close(squares)
    }()

    for  x := range squares{
        fmt.Println(x)
    }
}

相关文章

  • go的通道

    注: 本笔记是自己的学习笔记,都是自己的理解,而不是教学文章,要学习请自行阅读 图书 --- Go程序设计语...

  • 《Go语言四十二章经》第二十二章 通道(channel)

    《Go语言四十二章经》第二十二章 通道(channel) 作者:李骁 22.1 通道(channel) Go 奉行...

  • GO 中 defer的实现原理

    GO 中 defer的实现原理 我们来回顾一下上次的分享,分享了关于 通道的一些知识点 分享了 GO 中通道是什么...

  • golang 创建DB连接池

    使用通道 自己写的连接池 db.go pool.go id生成器 使用

  • 通道

    通道是 Go 并发编程中重要的一员 基础知识 通道是 Go 自带的,唯一一个可以满足并发安全性的类型。 声明并初始...

  • <>

    通道的基本操作# 通道本身是并发安全的,这也是go语言自带的唯一一个可以满足并发安全的的类型。 通道的初始化 通道...

  • Go管道初识

    Go管道初识 Go管道基础知识 管道分类 无缓冲(unbuffered channel)无缓冲的通道是指在接收前没...

  • go之通道类型

    1.基本知识 通道类型的值本身就是并发安全的,go语言自带的唯一一个可以满足并发安全的类型。通道相当于一个先进先出...

  • 你知道Python有一个并发编程库吗?goless

    前言 使用goless库,您可以用Python的Go语言风格编写并发程序。goess提供了通道、select和go...

  • Go 并发编程:通道常见应用范式

    通道经典应用 一、闭包实现通道访问限制 在Go的并发编程中,创建通道和开辟协程是非常方便且容易的,正因如此,有可能...

网友评论

      本文标题:go的通道

      本文链接:https://www.haomeiwen.com/subject/dejdghtx.html