深入理解golang chan的使用

深入理解golang chan的使用攻略

什么是chan

chan(channel)是Golang中的一种并发原语,主要用于在 goroutine 之间传递数据和信号,它起到了 goroutine 通信的桥梁作用。chan 是一种类型,可以通过 make 函数初始化。

chan的创建和初始化

chan 的创建和初始化使用make函数,其语法如下:

ch := make(chan valueType)

其中,valueType 为 chan 中编写的类型。通常,chan 分为同步的和异步的两种模式。同步的 chan 会等待数据的接收方去取数据,在发送方将数据发送到 chan 里后,将其阻塞直到对应的 goroutine 取出数据。而异步通道不会等待,发送方将数据发送到 chan 后,立刻继续执行,不阻塞。

chan的基本操作

chan 实例作为一个变量,可以进行一些基本操作。如:

  • 发送数据:使用<-操作符向 chan 中推入一条数据。
  • 接收数据:使用<-操作符从 chan 中取出一条数据,如果 chan 中没有数据可取,则该操作阻塞,直到有数据可取。
  • 关闭 chan:使用 close 函数来关闭 chan。

示例一:同步 chan

下面是同步 chan 的一个示例,当缓冲区为空时,读取操作会被阻塞。

package main

import "fmt"

func main() {
    ch := make(chan int)
    go func() {
        ch <- 10
    }()

    v := <- ch
    fmt.Println("The value received from the channel is", v)
}

在这个示例中,首先创建了一个 chan 变量,使用了make来初始化。然后,使用匿名函数发送值。匿名函数会在一个新的 goroutine 中启动,并将10的值发送到 chan 中。最后,接收 goroutine 阻塞在了等待 chan 接收数据的语句。

示例二:异步 chan

下面我们来看一个异步 chan 的示例。在这个示例中,无缓冲区 chan 不会阻塞,发送操作会直接输出,然后继续执行。

package main

import "fmt"

func main() {
    ch := make(chan int)
    go func() {
        ch <- 10
        fmt.Println("value is sent")
    }()

    fmt.Println("waiting for value")
    v := <- ch
    fmt.Println("The value received from the channel is", v)
}

在这个示例中,首先创建了一个 chan 变量,使用make来初始化。接着,使用匿名函数启动了一个新 goroutine,向 chan 中发送值,并输出"values is sent"。异步 channel 不会等待,所以输出语句直接执行,然后执行接收操作,等待从 chan 中取出发送的值。输出的第三行是最后的结果,它和第二行并列输出。

总结

可以看出,chan 是 Golang 中一个非常重要和强大的并发原语。我们可以通过 chan 在不同的 goroutine 之间进行通讯。另外,在使用 chan 时,需要注意的是场景,及其传输数据的类型,避免出现类型不兼容造成程序崩溃的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解golang chan的使用 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 100多行PHP代码实现socks5代理服务器[2]

    100多行PHP代码实现socks5代理服务器[2] 简介 在本文中,我们将介绍如何使用100多行PHP代码构建一个简单的socks5代理服务器。使用socks5代理服务器可以保护用户的隐私和安全,并帮助他们绕过网络审查。 准备工作 在开始构建代理服务器之前,请确保你已经安装了PHP,并了解如何在你的本地计算机上运行PHP文件。在这里,我将使用XAMPP作为…

    PHP 2023年5月27日
    00
  • PHP学习一(基础)第1/2页

    为了学习PHP,您可以按照以下步骤进行操作: 1.安装PHP和Web服务器 要开始学习PHP,您需要一个PHP解释器和一个Web服务器。 安装PHP 您可以从PHP官方网站下载最新版的PHP: https://www.php.net/downloads.php ,按照提示完成安装即可。 安装Web服务器 Web服务器是用于在浏览器中运行PHP脚本的。常见的W…

    PHP 2023年5月23日
    00
  • php将图片文件转换成二进制输出的方法

    当需要在PHP中将图片文件转换成二进制输出时,可以使用file_get_contents()函数将文件内容读取到一个字符串中,再使用base64_encode()函数对这个字符串进行编码,最后再通过输出流将编码后的字符串发送给客户端。 以下是详细的攻略: 1. 读取图片并进行编码 首先,可以使用file_get_contents()函数读取图片文件: $im…

    PHP 2023年5月26日
    00
  • PHP中使用数组指针函数操作数组示例

    首先,需要了解什么是数组指针函数。在PHP中,我们可以通过一系列的函数来操作数组指针,这些函数被称为数组指针函数。使用数组指针函数,可以方便地改变数组指针的位置,从而更加灵活地操作数组。 下面,我们通过两个示例来演示如何在PHP中使用数组指针函数操作数组。 示例一:使用 current() 和 next() 函数遍历数组 通常,在PHP中遍历数组的方法是使用…

    PHP 2023年5月26日
    00
  • php创建类并调用的实例方法

    下面是PHP创建类并调用实例方法的完整攻略,包括类的定义、对象的实例化和实例方法的调用。 1. 定义类 在PHP中,我们可以使用class关键字定义一个类,类名的首字母应该大写。 例如,定义一个Person类: class Person { // 在这里定义类的属性和方法 } 2. 定义属性和方法 在类的定义中,我们可以定义属性和方法。属性是类的变量,可以保…

    PHP 2023年5月25日
    00
  • PHP7引入的”??”和”?:”的区别讲解

    当PHP7引入的”??”和”?:”这两个操作符都用于在特定情况下进行短路求值,以简化代码并提高性能。 ??操作符 “??”操作符表示当左边的操作数为空或未定义时,使用右侧的默认值。例如,以下代码片段展示了如何使用”?”?”操作符: $username = $_GET[‘username’] ?? ‘Anonymous’; echo $username; 在上…

    PHP 2023年5月26日
    00
  • PHP读取大文件的类SplFileObject使用介绍

    当我们需要读取大文件时,如果使用普通的文件操作方式,容易导致内存爆掉,因此,使用SplFileObject类可以有效避免这个问题。下面我来详细讲解一下“PHP读取大文件的类SplFileObject使用介绍”的完整攻略。 使用SplFileObject类读取大文件的基本步骤 使用SplFileObject类读取大文件大致分为以下三个步骤: 实例化SplFil…

    PHP 2023年5月26日
    00
  • PHP中计算字符串相似度的函数代码

    下面是 PHP 中计算字符串相似度的函数代码的完整攻略。 1. 了解字符串相似度计算方法 常用的字符串相似度计算方法有:莱文斯坦距离、Jaccard系数、余弦相似度等。 莱文斯坦距离:指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。允许的编辑操作包括插入、删除、替换。 Jaccard系数:指两个集合的交集大小除以它们的并集大小。它衡量的是两个集合之…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部