在 Go 中如何使用分布式锁解决并发问题?

3 月 27 日
阅读 11 分钟
234
在分布式系统中,协调多个服务实例之间的共享资源访问是一个经典的挑战。传统的单机锁(如 sync.Mutex)无法实现跨进程工作,此时就需要用到分布式锁了。本文将介绍 Go 语言生态中基于 Redis 实现的分布式锁库 redsync,并探讨其使用方法和实现原理。

在 Go 中使用 cron 执行定时任务

3 月 17 日
阅读 10 分钟
339
如果你曾经在 Go 中实现过定时任务,可能会发现,原生的 time.Timer 或 time.Ticker 虽然简单易用,但在复杂的场景下(如多任务调度、时区处理、任务失败重试等)往往显得力不从心。这时,一个功能强大且灵活的定时任务库就显得尤为重要。

如何基于 Go 语言设计一个简洁优雅的分布式任务系统

3 月 11 日
阅读 17 分钟
402
在当今云计算与微服务盛行的时代,分布式任务系统已成为支撑大规模业务的核心基础设施。今天就来为大家分享下如何基于 Go 语言从零设计和实现一个架构简洁且扩展性强的分布式任务系统。

Go 并发编程:如何实现一个并发安全的 map

3 月 4 日
阅读 10 分钟
414
上周发布的文章「Go 并发控制:sync.Map 详解」有读者反馈说我写的太难了,上来就挑战源码,对新手不够友好。所以这篇文章算作补充,从入门到进阶的顺序讲解一下在 Go 中如何自己实现一个并发安全的 map。

Go 并发控制:sync.Map 详解

2 月 26 日
阅读 20 分钟
438
我们知道,Go 中的 map 类型是非并发安全的,所以 Go 就在 sync 包中提供了 map 的并发原语 sync.Map,允许并发操作,本文就带大家详细解读下 sync.Map 的原理。

Go 并发控制:semaphore 详解

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

Go os/exec 极速入门

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

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

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

超简单!用 Go 启动 Redis 实例

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

Go 并发控制:sync.Cond 详解

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

Go 并发控制:sync.WaitGroup 详解

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

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

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

Go 并发控制:context 源码解读

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

Go 并发控制:singleflight 详解

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

Go 并发控制:sync.Once 详解

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

Go 并发控制:errgroup 详解

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

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

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

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

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

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

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

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

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

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

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

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

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

Builder 模式在 Go 语言中的应用

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

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

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

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

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

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

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

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

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

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

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

中文文案排版指北

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