Go问答技术文章
-
Go 从 nil channel 接收不会返回零值,而是永久阻塞。本文通过复现、状态对比和 select 场景,说明如何定位 nil channel,并用初始化、超时或退出信号修复等待无出口问题。291 收藏 -
Go 发送到已关闭 channel 会直接触发 panic。本文从 close 语义、发送方所有权、多发送方汇合和取消信号四个角度说明如何安排关闭时机。386 收藏 -
Go 普通 map 不支持并发读写,读、写、删除和遍历必须进入同一个同步边界;本文用并发计数器演示 RWMutex 的封装方式,并说明何时评估 sync.Map。439 收藏 -
Go 的 map 遍历顺序没有语言保证,测试不应直接比较遍历结果的顺序;本文用排序、集合比较和显式顺序建模解决这类不稳定断言。163 收藏 -
Go 的 range 循环里取变量地址,是否重复取决于循环变量是用 := 声明还是用 = 复用,以及模块采用的 Go 版本。本文用切片副本、切片元素地址和旧版本兼容写法说明如何判断与修复。501 收藏 -
Go 切片 append 后原切片数据也变化,通常是因为新切片仍复用了容量范围内的底层数组。本文用 len、cap 和三切片表达式判断复用边界,并比较 append 隔离与 copy 深度复制的选择。291 收藏 -
Go 接口装入 typed nil 后为什么不等于 nil?本文用静态类型、动态类型和动态值拆开接口语义,解释 error 返回中的常见陷阱,并给出类型断言、反射与 API 边界的处理清单。113 收藏 -
Go 的 nil 指针接收者不一定一调用就 panic:方法可以先进入方法体,但字段解引用、值接收者和 nil 接口会形成不同边界。本文用最小示例拆开这些情况,并给出排查清单。179 收藏 -
Go map 多个 goroutine 同时读取通常没有读写冲突,但隐藏的刷新、延迟初始化或元素内部变更仍会触发数据竞态。本文用 RWMutex、race detector 和不可变快照拆清边界。207 收藏 -
Go exec.Command 使用裸程序名时会经过 PATH 查找,Go 1.19 起不会隐式执行当前目录中的程序。本文说明 ErrDot 原因、显式相对路径写法,以及 Dir、PATH 和兼容处理的区别。194 收藏 -
Go 导入 internal 包报 use of internal package not allowed,通常是调用方不在 internal 上方共同祖先的路径树中。本文用 go.mod、go list 和目录布局说明判断方法,并比较保留 internal、调整共同祖先与移动到公开包的修复选择。330 收藏 -
Go test 输出 cached 并不等于测试失效,而是成功的包测试结果被复用。本文说明如何用 -count=1 强制重跑、用 -run 和 -v 定位目标,以及何时使用 go clean -testcache。496 收藏 -
Go 的 testing.T.Setenv 会修改整个测试进程的环境,并用 Cleanup 恢复原值,因此不能用于并行测试或有并行祖先的测试。本文解释冲突原因,并给出串行设置、依赖注入和子进程隔离的选择方法。273 收藏 -
Go 中 nil 切片和空切片的 len 都是 0,但 reflect.DeepEqual 会因为 nil 状态不同返回 false。本文用最小示例解释原因,并比较 DeepEqual、slices.Equal 与规范化写法的适用边界。449 收藏 -
Go reflect.Set 报值不能修改,通常不是 Set 本身有问题,而是 Value 不可寻址或来自未导出字段。本文用结构体字段示例说明 ValueOf、Elem、CanSet 和安全写入函数的关系。303 收藏