Golang 在 Ubuntu 上编译有哪些注意事项

在 Ubuntu 上编译 Go 程序,真正容易出问题的往往不是 `go build` 本身,而是环境变量、依赖、交叉编译和缓存状态。本文按实际排查顺序梳理配置、构建优化与常见报错处理,方便你快速判断问题出在哪一层。

Golang 在 Ubuntu 上编译有哪些注意事项

Go map 缩容机制:为什么它更像“伪缩容”

Go 的 map 在删除大量元素后,通常不会像很多人预期的那样直接把底层容量缩小。真正发生的是对溢出桶的整理:满足条件时触发一次不改 B 值的重排,改善查找效率,却未必明显降低内存占用。理解这点,才能正确判断何时需要手动重建 map。

Go map 缩容机制:为什么它更像“伪缩容”

Go 微服务框架怎么选:5 个主流方案的定位、差异与落地建议

Go 微服务框架不少,但选型并不只看“谁更火”。这篇文章把 Go Micro、Go Zero、Go Kit、Kratos、Kitex 放到同一套判断标准里,对比能力边界、学习成本、性能取向和适配场景,帮助团队更快筛出可落地方案。 Go 微服务框架越多,选型反而越容易陷入“功能都差不多、又怕选错”的局面。

Go 微服务框架怎么选:5 个主流方案的定位、差异与落地建议

Go 语言设计哲学:为什么说组合优于继承?

Go 没有沿用 Java、C++ 那套继承体系,而是把代码复用的重点放在组合、结构体嵌入和接口配合上。本文从继承的局限、Go 的实现方式到几个典型示例,梳理为什么“组合优于继承”不是口号,而是更贴近 Go 设计哲学的工程选择。

Go 语言设计哲学:为什么说组合优于继承?

Go 语言里的 sync.OnceValue:把懒加载写得更直接

Go 1.21 新增的 sync.OnceValue,把“只执行一次”和“结果缓存”合成了一个更顺手的接口。它适合配置加载、连接初始化和昂贵计算这类懒加载场景,但在 panic 传播和失败重试策略上,和传统 sync.Once 仍有明显差异。

Go 语言里的 sync.OnceValue:把懒加载写得更直接

如何在 Go 语言中接收和处理系统信号?

在 Go 程序里接收系统信号,核心并不复杂:用 `os/signal` 监听,用带缓冲通道接收,再按 `SIGINT`、`SIGTERM`、`SIGHUP` 等类型决定退出、清理或重载。文章结合基础示例和 HTTP 服务优雅退出,梳理信号处理的常见做法与边界。

如何在 Go 语言中接收和处理系统信号?

Golang 在 Debian 上的并发处理怎样

在 Debian 上跑 Go,并发能力的上限往往不只取决于语言本身,还和调度、锁策略、对象复用以及系统环境配合有关。本文从 goroutine、channel、sync/atomic 到 GOMAXPROCS、pprof、trace 逐项拆开,说明哪些机制适合直接用,哪些场景需要进一步调优。

Golang 在 Debian 上的并发处理怎样

为什么 go.mod 中有两段 require 结构?

很多 Go 开发者第一次看到 go.mod 里出现两段 require,都会疑惑是不是写重复了。其实这正是 Go 1.17 之后依赖整理策略的一部分:一段放直接依赖,另一段集中列出带 // indirect 标记的间接依赖,方便识别、锁定版本并减少后续升级的不确定性。

为什么 go.mod 中有两段 require 结构?

Go 只有值传递,为什么切片和指针又像“引用传递”?

Go 并不存在“按引用传参”这一独立机制,函数参数一律按值复制。真正容易让人误判的是切片、map、channel 这类值里本身带有底层数据的引用信息,以及指针参数带来的可修改效果。 很多刚接触 Go 的开发者,都会在“值传递”和“引用传递”上卡一会儿:为什么传入 int 改不动原值,传入 slice 却像是能改到外面?

Go 只有值传递,为什么切片和指针又像“引用传递”?