跳转到主要内容

【Go语言中级开发】在 Go 中编写 JSON REST API 的技巧

本文提供了有关使用普通 Go HTTP 处理程序编写 JSON REST API 的随机提示。

  • 使用匿名类型解析 JSON
  • 使用 http.MaxBytesReader 限制请求长度
  • 使用 map[string]interface{} 生成 JSON
  • 使用 MarshalJSON 自定义 JSON 输出
  • 使用中间件处理错误
  • 使用结构对处理程序进行分组
  • 使用分段/编码

使用匿名类型解析 JSON


而不是声明全局类型:

【Go语言高级开发】为 Go (Golang) 配置 CORS

在之前的文章中,我们已经介绍了 CORS 是什么以及修复“没有 'access-control-allow-origin' 标头存在”的反向代理方法,但是当您需要更多灵活性时该怎么办? 本文将指导您完成在后端处理 CORS 的过程。 在这种特殊情况下,我们将为 Golang 网络应用程序实现它。 但是,这种技术适用于任何支持“http.Handler”的 Go HTTP 路由器框架。我们将在本教程中使用 Gorilla/Handlers,因此我们将坚持使用 Gorilla 系列并使用基于 Gorilla/Mux 的示例。

自然,与一般的编程一样,有多种方法可以实现相同的东西,从纯粹的 DIY 方法到预先构建并很好地打包在库中的方法。 如上所述,在本教程中,我们将采用后一种方法。 但是,在我们开始所有这些之前,让我们快速回顾一下我们试图解决的问题。

【Go语言数据库开发】Golang GORM 约定

ID 作为主键


GORM 默认使用名称为 ID 的字段作为表的主键。

type User struct {
  ID   string // field named `ID` will be used as a primary field by default
  Name string
}


您可以使用标签primaryKey将其他字段设置为主键

// Set field `UUID` as primary field
type Animal struct {
  ID     int64
  UUID   string `gorm:"primaryKey"`
  Name   string
  Age    int64
}


另请查看复合主键

【Go语言测试】使用基准分析 Go 函数的性能

这篇博文是对 justforfunc 第 28 集的补充,您可以在下方观看。

https://youtu.be/2AulMm-hsdI

在上一篇博文中,我讨论了在 Go 中合并 n 个通道的两种不同方式,但我们没有讨论哪种方式更快。与此同时,YouTube 评论中提出了第三种合并频道的方法。

这篇博文将展示第三种方式,并从性能角度比较所有方式,并使用基准进行分析。

第三种渠道合并方式


两集前,我们讨论了如何使用单个 goroutine 和 nil 通道合并两个通道。我们将这里的该函数称为 mergeTwo。一个 justforfunc 查看器提出了一种使用此函数和递归的方法,以提供一种合并 n 个通道的方法。


使用递归合并 N 个通道
解决方案非常聪明。如果我们有:

【Go语言测试】如何在 Go 中编写基准测试

这篇文章继续了我几周前开始的测试包系列。您可以在此处阅读上一篇关于编写表驱动测试的文章。您可以在 https://github.com/davecheney/fib 存储库中找到下面提到的代码。

介绍


Go 测试包包含一个基准测试工具,可用于检查 Go 代码的性能。这篇文章解释了如何使用测试包来编写一个简单的基准测试。

您还应该查看 Profiling Go 程序的介绍性段落,特别是有关在您的机器上配置电源管理的部分。无论好坏,现代 CPU 严重依赖主动热管理,这会给基准测试结果增加噪音。

编写基准


我们将重用上一篇文章中的 Fib 函数。

func Fib(n int) int {
        if n < 2 {
                return n
        }
        return Fib(n-1) + Fib(n-2)
}


基准放置在 _test.go 文件中,并遵循其测试对应物的规则。在第一个示例中,我们将对计算斐波那契数列中第 10 个数字的速度进行基准测试。

【Go语言测试】高级 Go 测试教程

🚀 我的新课程 - Golang 测试圣经现已推出,涵盖了启动和运行为 Go 应用程序创建测试所需的一切!

欢迎各位码农!在本教程中,我们将看看 Go 核心语言开发人员和流行的生产级工具等使用的更高级的测试实践的选择。

我觉得这种方法,即实际研究在生产系统中所做的事情,有望让您深入了解测试您自己的生产级 Go 程序的最佳方法。

注意 - 如果您对测试基于 Go 的程序完全不熟悉,那么我建议您查看我的另一个教程:go 测试简介

目标


在本教程结束时:

  • 您将对如何测试 Go 系统有更深入的了解
  • 您将知道如何分离您的单元和集成测试。
  • 您将知道如何模拟您的 Go 应用程序可能发出的任何 HTTP 请求。


先决条件


在您阅读本文之前,您将需要以下内容:

【Go语言高级开发】使用 Git Hooks 改进你的 Go 开发工作流程

Git hooks 是一种非常强大的改​​进开发工作流程的方法,无需记住运行额外的脚本或执行额外的任务。在本文中,我们将看看如何在项目存储库中定义自己的简单 git 钩子,它可以自动执行 linting + 格式化 Go 代码的任务。

这个相当简单的示例应该让您了解如何利用 git hooks 来实现您自己的狡猾计划。

现实生活中的例子


这方面的一个例子来自我当前的一个项目,其中团队必须在将机密文件推送到项目的存储库之前对其进行加密。加密文件是一件简单的事情,但由于我们正在处理的加密文件的数量,记住加密每个已更改的文件成为一项挑战,而且我们经常会运行我们的项目并挠头而我们试图弄清楚为什么它没有发现新的秘密。

解决方案


当试图解决这个问题时,我们可以使用的工具相当有限,并且不想使用会影响团队中有自己偏好的人的当前开发流程的东西。

【Go语言中级开发】Go Websocket 教程

嗨,开发人员! 在本教程中,我们将研究如何在我们自己的基于 Go 的程序中使用 WebSockets 来做一些很酷的实时事情。

在本教程结束时,我们应该已经涵盖了以下内容:

  • 什么是 WebSocket
  • 我们如何在 Go 中构建简单的 WebSocket 应用程序

出于本教程的目的,我们将使用 gorilla/websocket 包,因为我个人在一些生产应用程序中使用它并取得了巨大成功。

视频教程

https://youtu.be/dniVs0xKYKk

WebSockets - 它们是什么?


因此,我在许多不同的教程中多次介绍了这一点,但始终值得一提的是我们为什么使用 WebSocket 以及它们与传统 HTTP 请求的不同之处。

WebSockets 是升级后的 HTTP 连接,在连接被客户端或服务器终止之前一直存在。正是通过这个 WebSocket 连接,我们可以执行双工通信,这是一种非常奇特的方式,可以说我们可以使用这个单一连接从我们的客户端与服务器进行通信。

【Go语言中级开发】在 Go 中构建实时 YouTube 订阅者监视器

欢迎大家! 在本教程中,我们将获得一些乐趣,我们将在 Go 中创建一个实时的 YouTube 统计监控系统。

因此,我们将在本教程中研究许多不同的主题,例如创建 WebSocket 服务器和使用 WebSockets 与前端应用程序进行实时通信,以及如何与现有的 REST API 进行交互以 获取我们需要的订阅者统计信息。

目标


在本教程结束时:

  • 您将对如何在自己的 Go 应用程序中使用 WebSockets 有更好的理解。
  • 您将了解如何与 YouTube API 交互以检索您自己的 YouTube 频道的统计信息。

先决条件

 

  • 您需要在开发机器上安装 Go 版本 1.11+。

视频教程


如果您愿意,本教程可在此处以视频格式提供:

https://youtu.be/n3BQLHtsrkM

入门


首先,我们要创建一个新目录来工作。我们将其命名为 youtube-stats/。

【Go语言容器化】Go 多阶段 Docker 教程

欢迎各位码农!在本教程中,我们将研究多阶段 Docker 镜像以及如何使用它们来最小化生产 Go 应用程序所需的容器大小。

在本教程结束时,我们将涵盖以下概念:

  • 什么是多阶段 Dockerfile。
  • 我们如何为我们的 Go 应用程序构建简单的多阶段 Dockerfile

Docker 是一种强大的容器化技术,可用于轻松启动隔离且可重现的环境,在其中构建和运行我们的应用程序。它越来越受欢迎,越来越多的云服务提供商提供本地 docker 支持,让您可以轻松部署容器化应用程序,让全世界看到!

注意 - 本教程是我之前的 Go + Docker 教程的后续,可以在此处找到:使用 Docker 容器化您的 Go 应用程序

多阶段 Dockerfile 的需求是什么?


为了了解多阶段 Dockerfile 为何有用,我们将创建一个简单的 Dockerfile,它具有一个阶段来构建和运行我们的应用程序,另一个 Dockerfile 具有构建器阶段和生产阶段。

一旦我们创建了这两个不同的 Dockerfile,我们应该能够比较它们,并希望自己看到多阶段 Dockerfile 比它们更简单的对应物更受欢迎!