26

Go语言中channel的基础知识

 6 years ago
source link: https://studygolang.com/articles/15299?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

channel

goroutine 运行在相同的地址空间,因此访问共享内存必须做好同步。 goroutine 奉行 通过通信来共享内存,而不是共享内存来通信

引⽤类型 channel CSP 模式的具体实现,用于多个 goroutine 通讯。其内部实现了同步,确保并发安全。

  channel 类型

map 类似, channel 也一个对应 make 创建的底层数据结构的引用。

当我们复制一个 channel 或用于函数参数传递时,我们只是拷贝了一个 channel 引用,因此调用者何被调用者将引用同一个 channel 对象。和其它的引用类型一样, channel 的零值也是 nil

定义一个 channel 时,也需要定义发送到 channel 的值的类型。 channel 可以使用内置的 make() 函数来创建:

make ( chan   Type )   // 等价于 make(chan   Type,   0)

make ( chan   Type ,   capacity )

capacity = 0 时, channel 是无缓冲阻塞读写的,当 capacity > 0 时, channel 有缓冲、是非阻塞的,直到写满 capacity 个元素才阻塞写入。

channel 通过操作符 <- 来接收和发送数据,发送和接收数据语法:

channel   <-   value         // 发送 value channel

<- channel               // 接收并将其丢弃

x   :=   <- channel          // channel 中接收数据,并赋值给 x

x ,   ok   :=   <- channel      // 功能同上,同时检查通道是否已关闭或者是否为空

默认情况下, channel 接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得 goroutine 同步变的更加的简单,而不需要显式的 lock


Recommend

  • 67

    我们知道, Go语言为并发编程提供了简洁的编程方式, 你可以以"同步"的编程风格来并发执行代码, 比如使用go关键字新开一个goroutine。 对于网络编程,Go标准库和运行时内部采用 epoll/kqueue/IoCompletionPort来实现基于 event-loop的网络异步处理,但是通过netpo...

  • 68

    概述在实际工程项目中,我们希望通过程序的错误信息快速定位问题,但是又不喜欢错误处理代码写的冗余而又啰嗦。Go语言没有提供像Java、C#语言中的try...catch异常处理方式,而是通过函数返回值逐层往上抛。这种设计,鼓励工程师在代码中显式的检查错误,而非忽略错...

  • 53
    • 微信 mp.weixin.qq.com 7 years ago
    • Cache

    Go语言中的Interface

  • 82

    kubernetes/client-go是由Golang编写的、用于与K8s集群API通信的软件包。本文将讨论client-go使用的基本知识,如何为开发人员节约编写实际应用程序逻辑所需的时间,并分享使用client-go的最佳实践。

  • 50

    Go语言TCP/IP网络编程 乍一看,通过TCP/IP层连接两个进程会感觉可怕, 但是在Go语言中可能比你想象的要简单的多。 TCP/IP层发送数据的应用场景 当然很多情况下,不是大多数情况下,使用更高级别的网络协议毫无疑...

  • 106
    • Github github.com 7 years ago
    • Cache

    Go 语言中下划线的用法分析总结

    Go 语言中下划线的用法分析总结

  • 46

    结构体structstruct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型。...

  • 4

    包是函数和数据的集合使用package关键字进行定义文件名可以不完全与包名相同包名通常使用小写字母定义包里可以有很多文件,但是他们共享同一个包名通过函数名称的大小写区分私有还是可被外部使用的大写,...

  • 12

    什么是管道Channel为了解决与Groutines间的通讯问题,Go中提供给了管道Channel。Channel有点像是Linux系统的双向通讯管道,既可以发送消息,也可以接受消息。管道需要明确处理的数据类型,也就是在声明管道时必须还要声明类型。管道...

  • 2

    Go语言,作为一门现代编程语言,其并发模型是其最大的卖点之一。在Go的并发模型中,Channel是一种核心的数据结构,它提供了一种强大的方式来实现不同goroutines之间的通信。本文将深入探讨Channel的特性,并通过实例详细说明如何在Go语言中使用Channel。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK