Go 语言并发编程系列教程(八)—— 通道类型篇(四):错误和异常处理

在前面几篇通道教程中,我们陆续介绍了与通道相关的基本语法、单向通道以及 select 语句,有关通道的基本知识就介绍到这里,今天我们来看下通道使用过程中的错误和异常处理。 在并发编程的通信过程中,最需要处理的就是超时问题:比如向通道发送数据时发现通道已满,或者从通道接收数据时发现通道为空。如果不正确处理这些情况,很可能会导致整个协程阻塞并产生死锁。此外,如果我们试图向一个已经关闭的通道发...

Go 语言并发编程系列教程(七)—— 通道类型篇(三):通过 select 语句等待通道就绪

Go 语言还支持通过 select 分支语句选择指定分支代码执行,select 语句和之前介绍的 switch 语句语法结构类似,不同之处在于 select 的每个 case 语句必须是一个通道操作,要么是发送数据到通道,要么是从通道接收数据,此外 select 语句也支持 default 分支: select { case <-chan1: // 如果从...

Go 语言并发编程系列教程(六)—— 通道类型篇(二):单向通道及其使用

上篇教程我们介绍了管道类型的基本语法,通常,管道都是支持双向操作的:既可以往管道发送数据,也可以从管道接收数据。但在某些场景下,可能我们需要限制只能往管道发送数据,或者只能从管道接收数据,这个时候,就需要用到单向通道。 不过,这里我们需要澄清一下,通道本身还是要支持读写的,如果某个通道只支持写入操作,那么即便数据写进去了,不能被读取也毫无意义,同理,如果某个通道只支持读取操作,不能写入数...

基于 Laravel + Swoole + Vue 搭建实时在线聊天室(三):后台 WebSocket 服务器实现

今天我们继续聊天室项目后台功能的开发,现在,后端数据库已经就绪,基于 API Token 的用户认证功能已经实现,接下来,我们来实现聊天室功能的核心 —— WebSocket 服务器相关业务逻辑的实现。 创建 WebSocketHandler 首先我们在 app/Services 目录下创建用于处理 WebSocket 通信的 WebSocketHandler.php,并初始化 WebS...

Go 语言并发编程系列教程(五)—— 通道类型篇(一):基本语法和缓冲通道

在上篇教程中,学院君给大家演示了如何通过通道(channel)传递消息实现 Go 协程间的通信, 接下来,我们将通过几篇教程的篇幅来系统了解通道类型及其使用,从而更好地理解 Go 并发编程及其实现,我们首先从通道基本语法说起。 类型声明和初始化 通过上篇教程,想必你已经了解了通道类型的基本使用,我们可以通过 chan 类型关键字来声明通道类型变量: var ch chan int 上面这...

Go 语言并发编程系列教程(四):Go 协程通信实现(下)—— 通过 channel 进行消息传递

上篇教程学院君演示了如何通过共享内存实现协程通信,不过这种方式太过繁琐,且维护成本高,Go 语言推荐使用消息传递实现并发通信,这种消息通信机制被称为 channel,中文译作「通道」,可理解为传递消息的通道。 通道是 Go 语言在语言级别提供的协程通信方式,它是一种数据类型,本身是并发安全的,我们可以使用它在多个 goroutine 之间传递消息,而不必担心通道中的值被污染。 注:需要...

基于 Laravel + Swoole + Vue 搭建实时在线聊天室(二):后台数据库准备和 API 认证功能实现

上篇教程我们为聊天室项目准备好了开发环境并对项目进行了初始化,今天我们来设置数据库并完成简单的 API 认证功能。 数据库准备 关于数据库这块,我们需要为 Laravel 自带的用户表新增头像字段,然后创建一张消息表用于存放用户发送的消息,以便对历史消息进行查询。 更新用户表 首先,我们运行如下 Artisan 命令生成数据库迁移文件为用户表 users 新增头像字段: php arti...

Laravel 框架如何基于 Composer 实现类和文件的自动加载

对于熟练使用 Laravel 框架的同学来说,对 Composer 肯定不陌生,我们在 Laravel 框架中无论使用辅助函数还是 PHP 类,都不会涉及到类和文件的加载操作,但实际上这个工作是 Composer 这个大管家在底层默默帮我们完成的,那么,有多少同学知道 Composer 底层是如何实现 PHP 命名空间与文件目录的映射,以及类和文件的自动加载的? 以 Laravel 项...

Go 语言并发编程系列教程(三):Go 协程通信实现(上)—— 共享内存

在上篇教程中,我们已经演示了如何通过 goroutine 基于协程在 Go 语言中实现并发编程,从语法结构来说,Go 语言的协程是非常简单的,只需要通过 go 关键字声明即可,难点在于并发引起的不确定性,以及为了协调这种不确定性在不同协程间所要进行的通信,在并发开篇教程中,我们也介绍过在工程上,常见的并发通信模型有两种:共享内存和消息传递。 下面,我们先来看看如何通过共享内存来实现 G...

因网络问题导致 Go 语言依赖包下载慢或失败的几个解决方案

Go 语言由 Google 公司开发,由于众所周知的原因,托管 Go 语言包的某些域名可能在国内被屏蔽,比如 golang.org、google.com 等,因此,当我们下载托管在这些域名的包时,会出现网络问题导致的下载失败,以 google.golang.org/grpc 这个包为例,当我们下载它时,会出现如下错误提示: 即: Fetching https://google.gola...