【Go语言中级开发】在 Go 中编写 JSON REST API 的技巧
本文提供了有关使用普通 Go HTTP 处理程序编写 JSON REST API 的随机提示。
- 使用匿名类型解析 JSON
- 使用 http.MaxBytesReader 限制请求长度
- 使用 map[string]interface{} 生成 JSON
- 使用 MarshalJSON 自定义 JSON 输出
- 使用中间件处理错误
- 使用结构对处理程序进行分组
- 使用分段/编码
使用匿名类型解析 JSON
而不是声明全局类型:
【Go语言中级开发】Go Websocket 教程
嗨,开发人员! 在本教程中,我们将研究如何在我们自己的基于 Go 的程序中使用 WebSockets 来做一些很酷的实时事情。
在本教程结束时,我们应该已经涵盖了以下内容:
- 什么是 WebSocket
- 我们如何在 Go 中构建简单的 WebSocket 应用程序
出于本教程的目的,我们将使用 gorilla/websocket 包,因为我个人在一些生产应用程序中使用它并取得了巨大成功。
视频教程
https://youtu.be/dniVs0xKYKk
WebSockets - 它们是什么?
因此,我在许多不同的教程中多次介绍了这一点,但始终值得一提的是我们为什么使用 WebSocket 以及它们与传统 HTTP 请求的不同之处。
WebSockets 是升级后的 HTTP 连接,在连接被客户端或服务器终止之前一直存在。正是通过这个 WebSocket 连接,我们可以执行双工通信,这是一种非常奇特的方式,可以说我们可以使用这个单一连接从我们的客户端与服务器进行通信。
【Go语言容器化】Go 多阶段 Docker 教程
欢迎各位码农!在本教程中,我们将研究多阶段 Docker 镜像以及如何使用它们来最小化生产 Go 应用程序所需的容器大小。
在本教程结束时,我们将涵盖以下概念:
- 什么是多阶段 Dockerfile。
- 我们如何为我们的 Go 应用程序构建简单的多阶段 Dockerfile
Docker 是一种强大的容器化技术,可用于轻松启动隔离且可重现的环境,在其中构建和运行我们的应用程序。它越来越受欢迎,越来越多的云服务提供商提供本地 docker 支持,让您可以轻松部署容器化应用程序,让全世界看到!
注意 - 本教程是我之前的 Go + Docker 教程的后续,可以在此处找到:使用 Docker 容器化您的 Go 应用程序
多阶段 Dockerfile 的需求是什么?
为了了解多阶段 Dockerfile 为何有用,我们将创建一个简单的 Dockerfile,它具有一个阶段来构建和运行我们的应用程序,另一个 Dockerfile 具有构建器阶段和生产阶段。
一旦我们创建了这两个不同的 Dockerfile,我们应该能够比较它们,并希望自己看到多阶段 Dockerfile 比它们更简单的对应物更受欢迎!
【Go语言中级开发】在 Go 中读取和写入文件
注意 - 如果你对在 Go 中使用 JSON 感兴趣,你可能也喜欢我的其他教程 - Go JSON 教程
在本教程中,我们将了解如何使用 go 编程语言有效地读取和写入文件系统中的文件。
我们将用于读取和写入这些文件的方法将与文件格式无关。这意味着您将能够使用我们将介绍的技术来读取和写入 .txt、.csv、.xls 等,这些文件的唯一不同之处在于其结构您写入每种文件类型的数据。
读取文件
为了读取本地文件系统上的文件,您必须使用 io/ioutil 模块。您首先必须通过调用 ioutil.ReadFile("/path/to/my/file.ext") 将文件的内容拉入内存,这将获取您希望读取的文件的路径唯一的参数。这将返回文件的数据,或者可以像您通常处理 go 中的错误一样处理的错误。
创建一个名为 main.go 的新文件以及另一个名为 localfile.data 的文件。将一段随机文本添加到 .data 文件中,以便我们完成的 go 程序可以读取一些内容,然后执行以下操作:
【Go语言中级开发】在 Go 1.11 中使用临时文件和目录
Go 1.11 带来了一些非常酷的新功能,例如实验性的 Go Modules 功能,以及使用 ioutil 包中的新 TempFile 和 TempDir 函数创建临时文件和目录的能力。
从这些函数调用创建的临时文件和目录是全局唯一的,这很棒,因为它简化了我们在 Go 程序中处理数百甚至数千个文件的方式。
在本教程中,我们将研究如何在自己的 Go 程序和一些潜在用例中使用它们。
创建临时文件
让我们从新的 TempFile 函数开始。假设我们正在创建一个对象识别系统,它可以提取数千张汽车图片并将它们用作训练集。
对于我们拉入的每辆汽车,我们都希望创建一个具有唯一名称的临时文件,我们不一定关心。
【Go语言中级开发】Go 接受接口返回结构
欢迎地鼠!在本文中,我们将介绍接受接口和返回结构的概念,以及这如何帮助改进您的代码,使其更具可测试性和可维护性。
概述
在编写 Go 应用程序时,我想记住的关键事项之一是“我怎样才能使这个特定的功能尽可能地可测试?”。
对于更复杂的应用程序,能够在我们的应用程序中使用所有不同的代码路径可能有点像噩梦,这取决于我们构建某些组件的方式。
在本文中,我将首先演示一种接受指向结构的指针的方法,以及这如何限制我们测试事物的能力。然后,我们将看看如何通过一些细微的更改来改进代码,这些更改应该使我们能够做一些花哨的事情,比如使用 mock 和 fake 对我们的代码进行单元测试。
传递指针
让我们首先看一个不遵循接受接口的包的标准示例,返回结构的咒语。
在这个例子中,我们将在我们的应用程序中定义一个用户包,它需要某种形式的数据库来获取用户,然后,在一些业务逻辑之后,它将能够持久化所做的任何更改。
【Go语言中级开发】Go 开发者的任务文件
欢迎Gophers!在本教程中,我将展示如何在 Go 应用程序开发中利用 Taskfiles 来获得名利。
(免责声明):本文是在 CircleCI 中采用 Taskfiles 来帮助他们采用 Go 的。我不能因为发现 Taskfiles 而获得任何功劳,因为这是另一个突出优势的团队。
如果您已经加入 Go 社区一段时间,您可能熟悉在 Go 应用程序中使用 Makefile 或类似的构建工具,您甚至可能选择了某种形式的脚本来捕获一些较长的命令以便更轻松发展。
你们当中的受虐狂甚至可能刚刚将所有常规命令都记入了记忆中。如何记住所有不同的构建参数和设置超出了我的范围,但对你能够记住的严重赞誉。
但毫无疑问,Taskfiles 是我最喜欢的新方法之一,它可以在一个地方捕获一些我必须在日常开发活动中运行的更繁琐的命令。
示例任务文件
让我们快速看一下在 taskfile.dev 主页上演示的示例 Taskfile.yml -
【Go语言中级开发】使用 AES 进行加密和解密 - 教程
目标
在本教程结束时,您将能够……
- 使用 AES 加密文本 - Go 中的高级加密标准
- 然后,我们将研究将此加密消息写入文件
- 最后,我们将看看如何使用共享密钥解密此消息
由此,您应该能够构建自己的简单加密系统,该系统可以执行各种操作,例如加密文件系统上的文件并使用只有您知道的密码来保护它们,或者为您正在工作的系统的各个部分添加简单加密上。
介绍
我们将从查看 AES 或高级加密标准开始,因为这是我们将用于加密和解密 Go 程序中的信息的标准。
然后我们将构建一个非常简单的加密程序,它将从命令行接收一个密码短语,并将其与 AES 结合使用来加密一段文本。
完成此操作后,我们将创建一个对应程序,该程序将使用我们用于加密文本的相同密码来解密这段文本。
AES - 高级加密标准
因此,AES 或高级加密标准是一种对称密钥加密算法,最初由两位比利时密码学家 Joan Daemen 和 Vincent Rijmen 开发。
【Go语言Web开发】在 Go 中验证 HTTP JSON 请求
在选择您希望如何公开您的 Go 服务时,在 gRPC 和 HTTP 之间进行选择可能是一个相当困难的选择。 gRPC 为您提供了更高性能的网络传输,而围绕它的工具仍然落后于您更标准的基于 HTTP 的 API。
在本教程中,我们将研究如何利用 go-playground/validator 包来提高 API 和 UX 组件的安全性。
gRPC 服务中的验证
我喜欢 gRPC 服务开发的关键之一是通过 protobuf 定义对服务消费者施加的严格性。获得此设置的工具可以说更复杂一些,并且需要更长的时间,但一旦到位,它有助于确保消费者向您发送您期望的有效负载。
HTTP 替代方案
不过值得庆幸的是,有一种方法可以对传入 Go 服务的 HTTP JSON 请求实施某种程度的严格性。我们可以在我们的 HTTP 服务中使用一种称为 JSON 请求验证的技术,它可以有效地确保传入的请求在我们的服务处理之前通过一系列检查。
一个简单的例子
例如,让我们看一下处理诸如配置新用户帐户之类的任务的用户管理系统。我们通常会有一个看起来有点像这样的端点来创建新用户: