Go 并发编程中的非阻塞锁:TryLock()

Go 1.18 为 `sync.Mutex` 和 `sync.RWMutex` 补上了 `TryLock()`,让加锁失败时可以立即返回,而不是像 `Lock()` 一样持续阻塞。它适合“抢到就做、抢不到就放弃”的轻量并发控制,但也不该被当成通用解法,关键还是先判断场景是否真的需要非阻塞锁。

Go 并发编程中的非阻塞锁:TryLock()

Go 多模块工作区模式的最佳实践

Go 1.18 引入的工作区模式,解决了多模块项目里“上游改完还得先发版、下游才能联调”的低效问题。本文用一个三模块示例说明 go work 的初始化、模块加入方式、目录结构和发布后的回切流程,帮助你判断它何时适合替代 replace。

Go 多模块工作区模式的最佳实践

Golang 开发游戏服务端,几款常见框架怎么选

Golang 游戏服务端很难套用一个“大而全”的通用框架,选型通常取决于项目规模、分布式需求和团队经验。本文基于原文提到的活跃项目,梳理几款常见 Go 游戏服务端框架的定位、适用场景与入门建议,帮助你先缩小选择范围。

Golang 开发游戏服务端,几款常见框架怎么选

在 Go 语言中如何进行 AES-ECB-256 加解密

这篇文章用一个可直接运行的 Go 示例,说明如何借助 `github.com/forgoer/openssl` 快速完成 `AES-ECB-256` 的加解密,并补清实际使用时最容易出错的三件事:32 位密钥长度、`PKCS7_PADDING` 填充方式,以及跨语言对接时常见的 `base64` 编码处理。

在 Go 语言中如何进行 AES-ECB-256 加解密

Go 语言包管理利器:go mod

go mod 是 Go 项目默认的依赖管理方案,从初始化模块、引入依赖到清理和校验,都有相对稳定的工作流。本文按实际开发顺序梳理常用命令,帮助你判断该在什么场景下用 init、get、tidy 以及其他子命令。

Go 语言包管理利器:go mod

Go 构建时用 ldflags 注入版本信息,避免手动改版本号

Go 程序发布后,常见需求之一就是让可执行文件直接输出版本号。与其在代码里手动改常量,不如在构建阶段通过 `go build -ldflags` 注入版本变量,既省去改源码的步骤,也更适合发布流程和自动化打包。

Go 构建时用 ldflags 注入版本信息,避免手动改版本号

Go 语言中如何实现 RSA 加解密与签名验证

这篇文章用一个更省代码的 Go 封装库,梳理 RSA 在实际开发里的三个基本动作:生成密钥、公钥加密私钥解密、私钥签名公钥验签。示例都基于 `github.com/forgoer/openssl`,适合想快速落地 RSA 功能、同时分清加密和签名职责的 Go 开发者。

Go 语言中如何实现 RSA 加解密与签名验证

Go 如何兼容 PHP 的 serialize 和 unserialize

当 PHP 项目迁移到 Go 时,历史数据里常见的 `serialize()`/`unserialize()` 往往会成为兼容点。本文从 PHP 序列化规则入手,结合 `github.com/leeqvip/gophp` 的现成方案,说明 Go 里怎样直接解析和生成 PHP 序列化字符串,以及跨语言场景下该如何选择更稳妥的序列化格式。

Go 如何兼容 PHP 的 serialize 和 unserialize

Go 语言中的切片:从声明、初始化到追加与遍历

切片是 Go 中最常用的数据结构之一,看起来像数组,却更适合处理长度可变的数据。本文围绕声明、初始化、赋值、追加、再切片和遍历几个高频操作展开,结合代码说明切片怎么创建、何时扩容,以及日常开发里该怎样理解它和数组的区别。

Go 语言中的切片:从声明、初始化到追加与遍历

Go语言中的数组

Go 数组适合表示“长度固定、元素类型一致”的一组数据。本文从声明、赋值、遍历到求和示例,梳理数组最常见的用法,并指出下标、长度推导和 `for range` 的实际写法,帮助初学者快速判断数组该怎么写、什么时候用。

Go语言中的数组