【Go语言高级开发】Golang Goroutines 的并发性
现在,Go 是一种令人难以置信的高性能语言,它具有许多强大的功能,可让您构建令人难以置信的快速应用程序。通过为我们提供这些 goroutine 和通道,它重新定义了构建并发程序的意义。
使用 goroutine 是一种非常快速的方法,可以将顺序程序转换为并发程序,而无需担心创建线程或线程池之类的事情。但是,与所有并发编程一样,这会带来一些危险,在你跑来跑去在所有函数调用前面加上 go 关键字之前必须考虑这些危险。
在本教程中,我们将研究如何在基于 Go 的程序中使用 goroutine,并随后提高程序执行的性能。
目标
在本教程结束时,您应该:
- 对 goroutine 是什么以及如何使用它们来提高应用程序的性能有深入的了解
- 知道如何创建和使用匿名 goroutine。
- 了解使您的应用程序并发的一些危险。
视频教程
如果您愿意,本教程还提供视频格式。如果您想支持我的工作,请考虑喜欢并订阅我的 YouTube 频道。
https://youtu.be/ARHXmR0_MGY
【Go语言高级开发】Go Mutex 教程
在编写高并发应用程序时使用 Go 并不会阻止您编写具有竞争条件的系统。 这些竞争条件可能会导致您的系统出现意外问题,这些问题既难以调试,有时甚至更难修复。
因此,我们需要能够编写能够以安全的方式并发执行而不影响性能的 Go 程序。 这就是互斥体发挥作用的地方。
在本教程中,我将向您展示一些您可以在自己的 Go 应用程序中遵循的基本方法,这些方法将帮助您保护您的代码免受这些讨厌的竞争条件的影响。
视频教程
本教程以视频格式提供:
https://youtu.be/cjMdUmfzQWs
理论
在深入研究代码之前,让我们快速了解一下理论以及为什么我们需要互斥锁。
因此,互斥锁或互斥是一种机制,它允许我们防止并发进程进入数据的关键部分,而它已经由给定进程执行。
让我们考虑一个例子,我们有一个银行余额和一个从该银行余额存入和提取资金的系统。在单线程同步程序中,这将非常容易。我们可以通过少量的单元测试有效地保证它每次都能按预期工作。
但是,如果我们开始引入多线程,或者在 Go 的案例中引入多个 goroutine,我们可能会开始在代码中看到问题。
【Go语言高级开发】Go Channels 教程
在本教程中,我们将研究如何在基于 Go 的应用程序中使用通道。
通道是连接基于 Go 的应用程序中的 goroutine 之间的管道,允许通信以及随后在变量之间传递值。
与其他编程语言相比,它们非常方便,可以帮助您在 Go 中构建令人难以置信的高性能、高并发应用程序,而无需大惊小怪。这绝不是侥幸,在设计语言时,核心开发人员决定他们希望他们的语言中的并发性成为一等公民,并使其尽可能简单地使用,不要走得太远,也不允许开发人员他们需要工作的自由。
如此轻松地构建并发系统的能力首先吸引了我对这门语言的兴趣,我不得不说,到目前为止,这绝对是一种乐趣。
注意 - 如果您想了解有关 goroutine 的更多信息,我建议您查看我的其他关于 goroutines 的教程。
目标
在本教程结束时,您将:
- 对渠道背后的理论有深刻的理解
- 能够创建使用通道的简单并发 Go 应用程序
先决条件
为了完成本教程,您需要满足以下先决条件:
【Go语言高级开发】Go WaitGroup 教程
如果您刚刚开始学习 Go 以及如何实现高并发、高性能应用程序,那么了解 WaitGroups 至关重要。
在本教程中,我们将介绍以下内容:
- WaitGroups 是什么以及我们应该在什么时候使用它们
- 使用 WaitGroups 的简单示例
- WaitGroups 的真实示例
到此结束时,您应该对如何在您自己的并发 Go 应用程序中使用 WaitGroups 有一个坚实的掌握。
注意 - 本教程的完整代码可以在这里找到:TutorialEdge/go-waitgroup-tutorial
视频教程
https://youtu.be/0BPSR-W4GSY
了解等待组
让我们直接深入了解什么是 WaitGroup 以及它为我们解决了什么问题。
当您开始在 Go 中编写利用 goroutines 的应用程序时,您会遇到需要阻止代码库某些部分执行的场景,直到这些 goroutines 成功执行。
以这段代码为例:
【Go语言数据库开发】Golang ORM 教程
在本教程中,我们将了解如何使用 Go-ORM 或 GORM 以简单的方式与 sqlite3 数据库进行交互。
ORM 或对象关系管理器几乎充当我们开发人员和我们底层数据库技术之间的中介。 它们让我们基本上可以像往常一样使用对象,然后保存这些对象,而无需编写复杂的 SQL 语句。
在您不希望使用 SQL 但需要数据库的情况下,它们有效地降低了我们代码库的复杂性。
视频教程
https://youtu.be/VAGodyl84OY
安装
为了安装 jinzhu/gorm,您必须执行以下 go get 命令:
go get -u github.com/jinzhu/gorm
完成此操作后,您应该能够将 jinzhu/gorm 导入到任何基于 Go 的项目中。
一个简单的例子
例如,假设您想编写一个 go REST API,当某个 API 端点被命中时,它将新用户及其电子邮件保存到数据库中。
我们可以像这样在 go 结构中描述我们的用户:
【Go语言Web开发】使用 Go 和 Mailgun 发送电子邮件
在本教程中,我将演示如何使用 Go(Lang) 和 mailgun api 发送邮件。 值得庆幸的是,mailgun 的 API 非常棒,一旦您正确设置了所有内容,发送邮件就非常容易。
【Go语言高级开发】Go 装饰器函数模式教程
装饰器在 Python 和 TypeScript 等其他编程语言中肯定更为突出,但这并不是说你不能在 Go 中使用它们。事实上,对于某些问题,使用装饰器是完美的解决方案,我们希望在本教程中能找到答案。
了解装饰器模式
装饰器本质上允许您包装现有功能并在顶部附加或添加您自己的自定义功能。
在 Go 中,函数被视为第一类对象,这本质上意味着您可以像传递变量一样传递它们。让我们用一个非常简单的例子来看看这个:
【Go语言Web开发】使用 JWT 保护您的 Go REST API
注意 - 本教程的完整源代码可以在这里找到:TutorialEdge/go-jwt-tutorial
JWT,或者更正式地称为 JSON Web 令牌,是一种紧凑的、URL 安全的方式,用于表示要在两方之间传输的声明。这本质上是一种令人困惑的说法,即 JWT 允许您以无状态但安全的方式将信息从客户端传输到服务器。
先决条件
在您阅读本文之前,您将需要以下内容:
- 您需要在开发机器上安装 Go 版本 1.11+。
介绍
JWT 标准使用 HMAC 算法的密钥或使用 RSA 或 ECDSA 的公钥/私钥对。
注意 - 如果您对 JWT 的正式定义感兴趣,那么我建议您查看 RFC:RFC-7519
这些在单页应用程序 (SPA) 中被大量用作安全通信的手段,因为它们允许我们做两件关键的事情:
【Go语言Web开发】使用 Golang 创建 RESTful API
如果您正在编写任何形式的 Web 应用程序,那么您很可能与 1 个或多个 REST API 交互,以填充应用程序的动态部分并执行更新或删除数据库中的数据等任务。
在本教程中,您将构建一个成熟的 REST API,它公开 GET、POST、DELETE 和 PUT 端点,随后将允许您执行全部范围的 CRUD 操作。
为了保持简单并专注于基本概念,我们不会与任何后端数据库技术交互来存储我们将要玩的文章。但是,我们将编写此 REST API,以便轻松更新我们将定义的函数,以便它们对数据库进行后续调用以执行任何必要的 CRUD 操作。
如果您想了解有关如何使用 Go 与数据库交互的更多信息,可以查看以下文章:
源代码 - 可以在此处找到本文的完整源代码:TutorialEdge/create-rest-api-in-go-tutorial
先决条件
您需要在开发机器上安装 Go 版本 1.11+。
【Go语言Web开发】使用 Gorilla Mux 和 PostgreSQL 在 Go 中构建和测试 REST API
介绍
本教程将说明如何在 Go 中构建由 PostgreSQL 支持的 REST API,使用 Gorilla Mux 进行路由。本教程将采用测试驱动开发,最后将解释如何在开发过程中对数据库进行持续测试。
目标
在本教程结束时,您将:
- 熟悉 Gorilla Mux,并且
- 了解如何使用持续集成 (CI) 针对数据库测试您的应用程序。
先决条件
本教程假设:
- 基本熟悉 Go 和 PostgreSQL,以及
- 你有工作的 Go 和 PostgreSQL 安装。您可以使用 Docker 轻松运行测试数据库。
您将在此存储库中找到演示的完整代码。