云海的博客
首页
  • 接口
  • 数组
  • slice
  • map
  • 指针
  • 反射
  • Context
  • sync.map
  • 锁
  • 类型和类型指针分析
  • recover
  • 从零实现RPC框架
  • make和new区别
  • channel
  • sync.Once
  • sync.Pool
  • protobuf
  • MongoDB pkg源码-findone
  • MyBatis
  • Maven
  • 解析Laravel框架—路由处理
  • PHP(客户端)与 Golang(服务端)使用grpc+protobuf 通信
  • JAVA(客户端)与 Golang(服务端) 使用grpc+protobuf通信
  • Docker使用笔记-常用命令
  • Docker使用笔记-容器间通讯
  • Docker使用笔记-搭建Redis集群
  • Docker使用笔记-镜像多阶段构建
  • Kubernetes部署golang服务
  • Linux常用命令
  • Docker安装Prometheus与Grafana
  • Protobuf
  • TCP抓包
  • 概述-《TCP/IP详解》读书笔记
  • 索引
  • 事务隔离级别
  • 常识
  • 每日一题(1)
  • 每日一题(2)
  • 每日一题(3)
  • 每日一题(4)
关于
GitHub (opens new window)

云海

服务端研发
首页
  • 接口
  • 数组
  • slice
  • map
  • 指针
  • 反射
  • Context
  • sync.map
  • 锁
  • 类型和类型指针分析
  • recover
  • 从零实现RPC框架
  • make和new区别
  • channel
  • sync.Once
  • sync.Pool
  • protobuf
  • MongoDB pkg源码-findone
  • MyBatis
  • Maven
  • 解析Laravel框架—路由处理
  • PHP(客户端)与 Golang(服务端)使用grpc+protobuf 通信
  • JAVA(客户端)与 Golang(服务端) 使用grpc+protobuf通信
  • Docker使用笔记-常用命令
  • Docker使用笔记-容器间通讯
  • Docker使用笔记-搭建Redis集群
  • Docker使用笔记-镜像多阶段构建
  • Kubernetes部署golang服务
  • Linux常用命令
  • Docker安装Prometheus与Grafana
  • Protobuf
  • TCP抓包
  • 概述-《TCP/IP详解》读书笔记
  • 索引
  • 事务隔离级别
  • 常识
  • 每日一题(1)
  • 每日一题(2)
  • 每日一题(3)
  • 每日一题(4)
关于
GitHub (opens new window)
  • 接口
  • 数组
  • slice
  • map
  • 反射
  • sync.Pool
  • net包笔记
  • net-rpc分析
  • 指针
  • 数组排序
  • Context
  • sync.map
  • 锁
  • recover
  • 泛型
  • 类型和类型指针分析
  • make和new区别
  • channel
    • sync.Once
    • protobuf
    • GoLand debug(1)
    • 从零实现RPC框架
    • 从零开始学Go Origin框架
    • MongoDB pkg源码-findone
    • Golang
    云海
    2019-09-20
    目录

    channel

    # 概述

    Go语言的并发模型是CSP,提倡通过通信共享内存而不是通过共享内存而实现通信。 如果说goroutine是Go程序并发对执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。 Go语言中的通道channel是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出的原则,保证收发数据的顺序,每一个通道都是一个具体类型的导管,也就是声明channel的时候需要为其指定元素类型。

    channel是一种类型,一种引用类型,通道类型的空值是nil。声明通道类型的格式如下:

    var ch1 chan int
    var ch2 chan bool
    var ch3 chan []int  //声明一个传递int切片的通道
    
    1
    2
    3
    # channel操作

    通道有发送(send)、接收(receive)和关闭(close)三种操作。 发送和接收都使用<-符号

    关于关闭通道需要注意的事情是,只有在通知接收方goroutine所有的数据都发送完毕的时候才需要关闭通道。通道是可以被垃圾回收机制回收的,它和关闭文件是不一样的,在结束操作之后关闭文件是必须要做的,但关闭通道不是必须的。

    关闭后的通道有以下特点:

    • 对一个关闭的通道再发送值就会导致panic
    • 对一个关闭的通道进行接收会一直获取值直到通道为空
    • 对一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值
    • 关闭一个已经关闭的通道会导致panic

    无缓冲通道上的发送操作会阻塞,直到另一个goroutine再该通道上执行接收操作,这时值才能发送成功,两个goroutine将继续执行。相反,如果接收操作先执行,接收方的goroutine将阻塞,直到另一个goroutine再该通道上发送一个值。 使用无缓冲通道进行通信将导致发送和接收的goroutine同步化。因此,无缓冲通道也称为同步通道。

    # 单向通道

    chan<- 是一个只能发送的通道,可以发送,但是不可以接收 <-chan 是一个只能接收的通道,可以接收,但是不可以发送

    在函数传参及任何赋值操作中将双向通道转换为单向通道是可以的,但是反过来是不可以的。

    上次更新: 2023/01/11
    make和new区别
    sync.Once

    ← make和new区别 sync.Once→

    最近更新
    01
    函数
    04-11
    02
    面试题
    04-11
    03
    EFK日志收集系统单机版
    08-18
    更多文章>
    Theme by Vdoing | Copyright © 2022-2025 Evan Xu | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式