Go问答技术文章
-
Go select 在多个通信操作同时就绪时不会按 case 顺序提供业务优先级,而是选择一个可执行通信。本文用高价值、普通和后台三类通道说明非阻塞探测、处理预算、关闭边界与防饥饿设计。417 收藏 -
Go select 可以用 nil channel 动态屏蔽一个通信分支:初始设为 nil,启用时切换为有效 channel,停用或关闭后再置 nil。本文说明 select 的重算边界、关闭处理和 default 常见坑。477 收藏 -
多个 goroutine 共用一个 channel 时,不要让任意发送方直接关闭它。本文用 WaitGroup 统一等待发送方,用协调者关闭数据 channel,并用 done 处理接收方提前退出,避免 send on closed channel 和发送 goroutine 泄漏。312 收藏 -
Go 关闭带缓冲 channel 后,已经写入缓冲区的元素仍会按顺序读完。本文用代码说明 close、ok、range 与零值判断的边界。436 收藏 -
Go 的切片不能直接作为 map key,因为切片不是可比较类型。本文解释编译期限制、interface 动态键的 panic,并给出字符串、数组和结构体三种迁移方案。396 收藏 -
Go 在单 goroutine 中允许 range map 时 delete,但遍历顺序不稳定,新增键可能跳过;并发读写仍需锁或单 goroutine 所有权。426 收藏 -
Go maps.Clone 传入 nil map 后,返回值仍是 nil:读取安全但写入会 panic。本文对比 nil map 与空 map 的长度、读写和初始化差异,并说明 Clone 对嵌套 slice、map、指针值仍是浅复制。152 收藏 -
slices.Clone 会复制元素并保留输入切片的 nil 语义;copy 只搬运元素,目标切片是否为 nil、长度够不够,都由调用方先决定。本文用对照代码说明两者的边界。479 收藏 -
讲清 Go slices.Grow 的额外容量参数、返回值和循环位置:按预计总数计算剩余数量,在 append 前一次预留,避免把容量误当长度。250 收藏 -
slices.Clip 会把切片容量收紧到长度,适合在函数边界阻止下游 append 写入隐藏尾部,但它不复制元素,也不保证释放仍被引用的大底层数组。本文对比 Clip、三索引切片与复制方案。181 收藏 -
Go 方法值创建时会保存接收者。指针接收者保存的是指针副本,调用时仍能沿指针修改原对象;值接收者保存的是结构体副本,后续变化不会回写。340 收藏 -
Go nil 接收者调用方法不一定会 panic,关键要区分 nil 指针、nil 接口以及方法体是否发生字段解引用。本文用最小示例和检查表定位真实的 panic 边界。309 收藏 -
Go 中 T 与 *T 的方法集并不相同:值接收者方法同时属于 T 和 *T,指针接收者方法只属于 *T。本文用最小示例解释接口赋值失败、自动取址边界与实现选择。394 收藏 -
Go 1.20 起 fmt.Errorf 支持多个 %w,可把多个底层错误保留为可遍历分支。本文对比单错误链、多错误包装与 errors.Join 的边界,并给出 errors.Is、errors.As、go.mod 和 CI 的迁移检查清单。342 收藏 -
Go errors.As 匹配自定义错误时,目标变量的值类型、指针类型和地址层级必须与错误的动态类型一致。本文用包装错误示例说明为什么拿不到值,以及如何排查 nil 指针和类型错配。418 收藏