深入理解golang chan的使用

yizhihongxing

深入理解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日

相关文章

  • php 中文和编码判断代码

    关于PHP中的中文和编码判断代码的攻略,我们可以分为以下几个方面: PHP 中文编码概述 判断字符串是否包含中文 判断字符串的编码类型 示例说明 1. PHP 中文编码概述 PHP中文编码主要有两种: GBK 和 UTF-8。GBK是一个垂直升级的ASCII码,兼容了GB2312的中文编码,很多编码为GBK的程序几乎可以完美处理GB2312编码的中文文本。U…

    PHP 2023年5月24日
    00
  • PHP 处理图片的类实现代码

    那么我们来详细讲解一下 PHP 如何处理图片的类实现代码。 首先,在 PHP 中处理图片需要用到 GD 库,所以要确认 GD 库是否已经安装并启用。 接下来,创建一个 PHP 文件,并引入 GD 库的相关文件: <?php // 引入 GD 库 extension_loaded(‘gd’) or die(‘GD 模块没有安装’); // 引入相关文件 …

    PHP 2023年5月23日
    00
  • php 数组使用详解 推荐

    标题:PHP数组使用详解 什么是数组 在 PHP 中,数组是一种用来存储多个值的数据结构,在一些情况下它比使用单独的变量来存储多个值更加方便。 数组的定义 定义数组的一般格式如下所示: $array = array( "foo" => "bar", "bar" => "foo&…

    PHP 2023年5月26日
    00
  • php实时倒计时功能实现方法详解

    下面将详细讲解“php实时倒计时功能实现方法详解”的完整攻略。 1. 基础知识 在实现实时倒计时功能之前,我们需要先掌握一些基础知识。我们需要使用PHP、JavaScript来实现。 PHP:一种脚本语言,通常用于Web开发,可以与HTML相互嵌套使用;JavaScript:一种脚本语言,可以在Web页面中嵌入,并且可以提供页面交互功能。 我们将使用PHP作…

    PHP 2023年5月27日
    00
  • 浅谈Python项目的服务器部署

    一、概述 Python是一门十分流行的脚本语言,使用Python语言开发的Web应用也是很方便的。但是,开发完Web应用之后,如何将其部署到服务器上却是一件比较困难的事情。在本文中,我们将从准备工作、环境搭建、代码部署等多个方面来讲解Python Web项目的服务器部署攻略。 二、准备工作 在进行Python项目的服务器部署之前,我们需要做好以下准备工作: …

    PHP 2023年5月23日
    00
  • 雷神第五代911笔记本性能怎么样 雷神第五代911游戏本深度评测

    雷神第五代911笔记本性能评测 选购建议 雷神第五代911笔记本作为一款高性能游戏本,配备了Intel i7-9750H CPU,NVIDIA GeForce RTX 2060显卡,16GB DDR4 2666MHz内存,512GB M.2 NVMe固态硬盘等高配,可以满足玩家对于游戏性能的需求。同时,身材轻薄,重量仅2.2kg,电池续航时间长,采用了全新的…

    PHP 2023年5月27日
    00
  • PHP递归调用数组值并用其执行指定函数的方法

    下面是详细的讲解: PHP递归调用数组值并用其执行指定函数的方法 什么是递归调用? 递归(Recursion)是指在程序执行中调用自身的编程技巧。递归函数是在一个函数内部调用自身的函数,可以用于解决许多复杂的问题,例如二叉树的遍历、快速排序、阶乘计算等。 如何递归调用数组值并用其执行指定函数? 在PHP中,我们可以通过递归函数来遍历数组的所有元素并执行指定的…

    PHP 2023年5月26日
    00
  • 微信小程序canvas写字板效果及实例

    微信小程序canvas写字板效果及实例 概述 在微信小程序中,使用canvas可以实现很多有趣的效果,如播放动画、绘制图形等等。其中,canvas写字板效果可以让用户在小程序中手写文字,增加用户体验和交互性。在本教程中,我们将详细讲解如何使用canvas实现写字板效果,并提供两个示例说明。 步骤 第一步:创建画布 在小程序页面中添加canvas标签,并设置宽…

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