Go 并发控制:semaphore 详解

2 月 19 日
阅读 10 分钟
203
一个生活中的例子:假设一个餐厅总共有 10 张餐桌,每来 1 位顾客占用 1 张餐桌,那么同一时间共计可以有 10 人在就餐,超过 10 人则需要排队等位;如果有 1 位顾客就餐完成,则可以让排队等待的第 1 位顾客来就餐。

Go os/exec 极速入门

2 月 7 日
阅读 16 分钟
352
os/exec 是 Go 提供的内置包,可以用来执行外部命令或程序。比如,我们的主机上安装了 redis-server 二进制文件,那么就可以使用 os/exec 在 Go 程序中启动 redis-server 提供服务。当然,我们也可以使用 os/exec 执行 ls、pwd 等操作系统内置命令。本文不求内容多么深入,旨在带大家极速入门 os/exec 的常规使用。

用 Go 语言还原 2025 刘谦春晚魔术!

1 月 30 日
阅读 4 分钟
677
先吐个槽,相比去年的魔术,今年的魔术是不是有点「降本增效」了 :)。我看有人提到今年的魔术类似冒泡排序...这个属实有亿点🤏夸张了<font style="color:rgb(33, 33, 33);"> </font><font style="color:rgb(33, 33, 33);">😅</font>。
封面图

超简单!用 Go 启动 Redis 实例

1 月 22 日
阅读 5 分钟
411
最近写了几篇 Go 并发编程相关的文章,想必有些读者看多了可能会有些厌倦,今天来点轻松的内容,介绍一个可以用来启动 redis-server 的开源库 github.com/stvp/tempredis。这是一个用 Go 语言开发的包,专门用于创建临时的 Redis 实例,主要用于测试目的。它可以在本地启动一个临时的 Redis 服务实例,在测试结束后自动...

Go 并发控制:sync.Cond 详解

1 月 17 日
阅读 11 分钟
482
在 Go 中因为 channel 的存在,sync.Cond 并发原语并不常用。不过在一些开源组件中还能能见到 sync.Cond 的应用,比如 Kubernetes 用它来实现并发等待队列,这也是 sync.Cond 的典型应用场景。本文将通过源码和示例带你学会 sync.Cond 的正确用法。

Go 并发控制:sync.WaitGroup 详解

1 月 10 日
阅读 9 分钟
425
前段时间我在《Go 并发控制:errgroup 详解》一文中讲解了 errgroup 的用法和源码,通过源码我们知道 errgroup 内部是使用 sync.WaitGroup 实现的,那么本文就更进一步,来探索下 sync.WaitGroup 源码是如何实现的。

Go 源码是如何解决测试代码循环依赖问题的?

2024-12-31
阅读 6 分钟
446
最近我写了一篇讲解 context 包源码的文章《Go 并发控制:context 源码解读》,在阅读源码的过程中,我在 context 包测试代码中发现了一个解决循环依赖的小技巧,在此分享给大家。

Go 并发控制:context 源码解读

2024-12-25
阅读 23 分钟
457
context 是 Go 语言的特色设计之一,主要作用有两个:控制链路和安全传值,并且 context 是并发安全的。<font style="color:rgb(32, 34, 36);">context 在 Go 1.17 版本被引入,经过数年的迭代,在设计和用法上已经趋于稳定,本文以最新的 Go 1.23.0 版本源码为基础,带你深入理解 context 的设计和实现...

在 Go 中如何获取 goroutine 的 id?

2024-12-17
阅读 5 分钟
462
如果你使用过如 Python、Java 等主流支持并发的编程语言,那么通常都能够比较容易的获得进程和线程的 id。但是在 Go 语言,没有直接提供对多进程和多线程的支持,而是提供了 goroutine 来支持并发编程。不过在 Go 中,获取 goroutine 的 id 并不像其他编程语言那样容易,但依然有办法,本文就来介绍下如何实现。

Go 并发控制:singleflight 详解

2024-12-10
阅读 15 分钟
659
比如,当我们有多个 goroutine 并发调用一个同一个函数时,singleflight 能够实现只让一个 goroutine 发起调用,其他 goroutine 则阻塞等待,当发起调用的 goroutine 返回后,singleflight 将结果同时返回给所有 goroutine。这样我们就减少了大量的并发调用,避免重复操作。

Go 并发控制:sync.Once 详解

2024-12-05
阅读 15 分钟
427
在 Go 语言的并发编程中,常常会遇到需要确保某个操作仅执行一次的场景。sync.Once 是 Go 标准库中的一个简单而强大的工具,专门用于解决这种需求。本文将深入解析 sync.Once 的使用方法和原理,帮助你更好地理解 sync.Once 在并发控制中的用法。

Go 并发控制:errgroup 详解

2024-11-19
阅读 18 分钟
407
我们知道,Go 标准库中有个 sync.WaitGroup 可以用来并发执行多个 goroutine,errgroup 就是在其基础上实现了 errgroup.Group。不过,errgroup.Group 和 sync.WaitGroup 在功能上是有区别的,尽管它们都用于管理 goroutine 的同步。

一行命令为项目文件添加开源协议头

2024-11-04
阅读 29 分钟
439
如果一个现有的项目,想要开源,免不了要为项目中的文件增加开源协议头信息。虽然很多 IDE 都可以为新创建的文件自动增加头信息,但修改已有的文件还是要麻烦些。好在我们有 addlicense 工具可以使用,一行命令就能搞定。并且 addlicense 是用 Go 语言开发的,本文不仅教你如何使用,还会对其源码进行分析讲解。

Go 错误处理指北:Defer、Panic、Recover 三剑客

2024-10-28
阅读 23 分钟
1.2k
Go 语言中的错误处理不仅仅只有 if err != nil,defer、panic 和 recover 这三个相对来说不不如 if err != nil 有名气的控制流语句,也与错误处理息息相关。本文就来讲解下这三者在 Go 语言中的应用。

Go 错误处理指北:如何优雅的处理错误?

2024-10-21
阅读 27 分钟
1.8k
本文是 Go 错误处理指北系列第三篇文章:如何优雅的处理错误?作为铺垫,我在系列的前两篇文章 Error vs Exception vs ErrNo 和 pkg/errors 源码解读 中分别讲解了 Go 错误处理机制和流行的第三方包 pkg/errors,现在是时候对 Go 语言中的错误处理做一个比较全面的讲解了。

厌倦了黑底白字?用 Go 给终端点颜色瞧瞧!

2024-10-08
阅读 6 分钟
644
如果你每天都在使用终端,想必无法忍受终端永远都是黑白两种配色。如果你不知道终端中各种花哨的颜色是如何输出的,那么本文就来帮你解答。而如果你恰巧在使用 Go 语言,那么你将在一分钟内学会使用 Go 语言在终端中输出彩色字符。废话不多说,我们开始吧。给终端加点颜色Go 社区中有一个叫 fatih/color 的包,可以非常...
封面图

Go 错误处理指北:pkg/errors 源码解读

2024-09-19
阅读 18 分钟
811
pkg/errors 包在 Go 错误处理生态中可谓大名鼎鼎了,截止目前在 GitHub 上有 8.2k 的 star 量。虽然不是 Go 官方包,但却被很多团队当作事实标准来使用。

Go 错误处理指北:Error vs Exception vs ErrNo

2024-09-09
阅读 8 分钟
465
很多有其他编程语言经验的人初次接触 Go 语言时,想必对 if err != nil 的错误处理方式感到新奇,之后用久了,竟发现有点令人抓狂。

Builder 模式在 Go 语言中的应用

2024-09-09
阅读 12 分钟
471
Builder 模式,中文翻译不太统一,有时候被翻译为建造者模式或构建者模式,有时候也被翻译为生成器模式。为了不给读者造成困扰,我还是直接叫它 Builder 模式好了。

Go 程序如何实现优雅退出?来看看 K8s 是怎么做的——下篇

2024-08-29
阅读 25 分钟
563
现在,我们已经掌握了 Go 中 HTTP Server 程序如何实现优雅退出,是时候看一看 K8s 中提供的一种更为优雅的优雅退出退出方案了😄。
封面图

Go 程序如何实现优雅退出?来看看 K8s 是怎么做的——上篇

2024-08-27
阅读 37 分钟
1.3k
在写 Go 程序时,优雅退出是一个老生常谈的问题,也是我们在微服务开发过程中的标配,本文就来介绍下工作中常见的几种优雅退出场景,以及带大家一起来看一下 K8s 中的优雅退出是怎么实现的。
封面图

K8s 如何设置容器 /dev/shm 控制共享内存大小

2024-08-13
阅读 6 分钟
949
多卡启用 vLLM 框架推理由于 Pod 创建时分配的共享内存大小太小导致 NCCL 没法利用 shm 创建卡间通信,这个问题看下谁那边解决下?
封面图

适配器模式在 Go 语言中的应用

2024-08-06
阅读 8 分钟
412
适配器模式(Adapter Pattern)是 23 种经典设计模式中的一种,属于行为型模式,它允许不兼容的接口协同工作。该模式通过创建一个适配器类,封装不兼容的接口,并对外提供一个兼容的接口。

在 Go 中如何使用反射实现简易版 encoding/json

2024-07-31
阅读 13 分钟
437
在使用 Go 语言开发过程中,我们经常需要实现结构体到 JSON 字符串的序列化(Marshalling)或 JSON 字符串到结构体的反序列化(Unmarshalling)操作。Go 为我们提供了 encoding/json 库可以很方便的实现这一需求。
封面图

中文文案排版指北

2024-07-23
阅读 9 分钟
402
「有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。与大家共勉之。」——vinta/paranoid-auto-spacing
封面图

在 Go 中如何使用 go:embed 指令嵌入静态文件

2024-07-16
阅读 18 分钟
3.4k
有时候,将配置文件、模板甚至整个前端应用直接嵌入到 Go 二进制文件中,是一种提高应用部署效率和简化操作的有效方法。自从 Go 1.16 版本起,Go 语言官方引入了 //go:embed 指令,这使得嵌入静态资源变得异常简单而直接。本文将详细介绍如何在你的 Go 应用中使用这一强大的特性。
封面图

Go 语言中的结构体内存对齐你了解吗?

2024-07-09
阅读 26 分钟
583
这是一篇填坑文章,我在《Go 中空结构体惯用法,我帮你总结全了!》一文中提到了 Go 中空结构体对内存对齐的影响,并承诺近期会写一篇关于 Go 结构体内存对齐的文章。本文就来详述一下在 Go 中什么是结构体内存对齐,以及内存对齐规则是什么。
封面图

在 Go 中如何检查结构体是否为空

2024-06-28
阅读 2 分钟
1.1k
本文概述了几种在 Go 中判断结构体是否为空的方法,适用于具有可比较字段和不可比较字段的结构体。Go 中的空结构体是指所有字段均设置为对应字段零值的结构体。
封面图

万字解析 Go 官方结构化日志包 slog

2024-06-26
阅读 34 分钟
3.1k
slog 日志包是 Go 语言中的一个结构化日志库,旨在提供一个简单而强大的日志系统。因为标准日志库 log 过于简陋,社区中经常有人吐槽,Go 官方也承认了这一点,于是 Go 团队成员 Jonathan Amsterdam 操刀设计了新的日志库 slog,其放在 log/slog 目录中。
封面图

在 Go 中如何让结构体不可比较?

2024-06-18
阅读 4 分钟
783
最近我在使用 Go 官方出品的结构化日志包 slog 时,看到 slog.Value 源码中有一个比较好玩的小 Tips,可以限制两个结构体之间的相等性比较,本文就来跟大家分享下。
封面图