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

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

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

如何彻底搞懂 Golang 模块的加载顺序

Go 模块到底按什么顺序加载,常常会被误解成 import 书写顺序或文件顺序。本文把 require、replace、import 解析、缓存与 go.work 干扰、以及 init 执行关系拆开说明,帮助你用 go list、go build 等线索判断“实际加载了谁、为什么这样加载”。 很多 Go 开发者以为模块加载跟 import 书写顺序或文件名直接相关,结果一碰到 replace 、 go.work 或匿名导入就容易判断失准。

如何彻底搞懂 Golang 模块的加载顺序

Go 1.21 新增的 toolchain 指令,到底该怎么理解和使用?

Go 1.21 起,`go.mod` 多了一个容易被忽略的 `toolchain` 指令。它不是替代 `go` 版本声明,而是把“最低语言版本”和“实际构建工具链版本”拆开管理,适合需要统一开发环境、控制补丁版本、逐步升级 Go 的项目。 Go 1.21 之后,`go.mod` 里的 `toolchain` 开始频繁出现在新项目中,但不少人看到它时,第一反应仍是“这和 `go` 指令到底差在哪”。

Go 1.21 新增的 toolchain 指令,到底该怎么理解和使用?

Golang 在 Debian 上的安全配置方法

在 Debian 上部署 Go 应用,安全工作不能只盯着代码本身,系统、运行环境和后续维护同样决定风险上限。本文按“系统加固、Go 环境配置、安全编码、上线运维”四个层次梳理可直接落地的做法,并保留关键命令与配置点,方便部署时逐项核对。

Golang 在 Debian 上的安全配置方法

Golang 编译报错信息解读:常见提示到底在说什么

Go 编译报错看似密集,其实大多能归到几类固定模式。本文按“名称未定义、类型不匹配、语法问题、多返回值、包与导入异常”重新整理常见报错,结合报错原文解释它到底在提示什么,以及排查时该先看哪里。

Golang 编译报错信息解读:常见提示到底在说什么

Golang 日志备份与恢复怎么做

在 Go 项目里,日志写出来并不等于可用,真正影响排障效率的是文件能否按策略备份、在故障时迅速恢复。本文基于一个简单示例,拆开讲清日志库的角色、定时备份与恢复代码的实现方式,以及上线前需要补齐的频率、保留数量、压缩和并发保护等关键点。

Golang 日志备份与恢复怎么做

Go 语言中的流程控制语句

这篇文章用 Go 中最常见的三类流程控制语句做一轮梳理:`if/else` 负责条件判断,`switch` 负责多分支选择,`for` 则覆盖普通循环、类 `while` 写法和无限循环。结合示例代码与九九乘法表,你可以快速判断不同场景该选哪种结构。

Go 语言中的流程控制语句

Go 代码的进化美学:strings.Clone / bytes.Clone

Go 1.18 新增的 strings.Clone 和 bytes.Clone,看起来只是两个小函数,却补上了字符串和字节切片“显式复制”这块长期缺失的表达能力。它们不仅让代码更短,更关键的是把“我要一个独立副本”的意图直接写在代码里,也减少了共享底层内存带来的隐性问题。

Go 代码的进化美学:strings.Clone / bytes.Clone

Debian 如何配置 Golang 的网络参数

在 Debian 上给 Go 配置网络相关环境,核心就是理清 `GOROOT`、`GOPATH`、`GOROOT_BOOTSTRAP`、`GOBIN` 以及代理变量各自负责什么。本文按“变量用途、写入位置、生效方式”重新整理,方便你一次配齐并判断哪些配置其实可以保留默认值。

Debian 如何配置 Golang 的网络参数

从 bytes.Buffer 到 io.Pipe:实现零拷贝数据流转的实践

在 Go 中把一个 io.Writer 的输出接到 io.Reader,很多人会先想到 bytes.Buffer。但数据一旦上到 GB 级,缓存整段内容很容易把内存顶满。本文围绕 io.Pipe 的同步管道机制,梳理它的工作方式、常见死锁原因、错误传递方法,以及它和 bytes.Buffer 的适用边界。

从 bytes.Buffer 到 io.Pipe:实现零拷贝数据流转的实践