在 Go 中如何获取 goroutine 的 id?

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

Go 并发控制:singleflight 详解

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

Go 并发控制:sync.Once 详解

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

Go 并发控制:errgroup 详解

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

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

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

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

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

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

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

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

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

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

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

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

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

Builder 模式在 Go 语言中的应用

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

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

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

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

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

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

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

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

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

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

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

中文文案排版指北

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

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

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

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

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

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

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

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

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

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

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