Go语言技术文章
-
Go 读取结构体自定义标签时,先通过 reflect.TypeOf 和 Field 拿到 StructField,再用 Tag.Lookup 区分标签缺失与显式空值;Tag.Get 适合只关心字符串的兼容场景,但非约定格式的返回值不应被依赖。291 收藏 -
Go 的 build tag 不是只作用于测试文件。本文拆开构建约束、_test.go 后缀和 go test 文件选择规则,给出用 go list 与 go test 定位测试覆盖问题的方法。375 收藏 -
Go 1.23 的 range-over-function 会把循环里的 break 转成迭代器可识别的停止信号。本文用 iter.Seq、Seq2 和 iter.Pull 说明 yield 返回 false、defer 清理与 stop() 的配合,解决惰性遍历提前结束时资源没有释放的问题。380 收藏 -
Go 按平台拆分文件时,文件名后缀本身就是构建约束;本文说明 GOOS、GOARCH、//go:build 的叠加关系,并用 go list 查看实际入选文件,排查同名实现冲突和跨平台测试遗漏。263 收藏 -
iter.Seq2 的 K、V 是按值传给 yield 的,不能靠取 range 变量地址消除复制。本文对比指针返回、ID 句柄和保留值返回,给出生命周期、并发与提前停止的实用边界。441 收藏 -
Go build tags 复杂组合容易把 AND、OR、文件名后缀和 cgo 条件混在一起。本文用布尔表达式、go list 文件集合和跨环境测试矩阵,说明如何验证每条 build tags 路径。191 收藏 -
用 Go 1.23 的 iter.Seq 把 cursor 分页查询包装成惰性遍历,说明 yield 返回值、提前停止、重复游标和错误边界;需要保留页码时再用 iter.Seq2 传递附加信息。203 收藏 -
发布 Go 模块时,不能只检查 vendor 目录是否存在。通过重新生成 vendor、对照 vendor/modules.txt 和强制 -mod=vendor 构建,可以及时发现依赖版本漂移。312 收藏 -
maps.Keys 返回的键迭代顺序并不保证一致。本文用 slices.Sorted 和兼容写法,把 map 键转换为可复现的排序切片,并解释稳定结果与稳定排序算法的区别。158 收藏 -
Go 命令发现 vendor/modules.txt 与 go.mod 不一致时,不要手工改清单。先让 go.mod 和源码恢复准确,再用 go mod vendor 重建 vendor,最后用明确的 -mod 参数验收。159 收藏 -
用 Go maps.Copy 合并默认配置和覆盖配置,明确 dst/src 的覆盖方向,处理 nil 目标 map,并说明嵌套切片等值的浅复制边界。391 收藏 -
go mod vendor 后构建仍访问 module cache?从 GOMOD、GOWORK、GOFLAGS、vendor/modules.txt 和 -mod 模式逐层定位。357 收藏 -
Go maps.Clone 只做浅克隆:本文用顶层 map、嵌套 map、切片和指针说明哪些数据独立、哪些仍会共享,并给出按 value 类型选择复制策略的实战判断。501 收藏 -
GOPROXY=off 只禁止新的模块源通信,不会自动扫描兄弟目录。本文区分主模块、go.work/replace、本地模块缓存和 sumdb 校验链,按错误信息给出离线构建的排查与修复方法。106 收藏 -
Go slices.Clone 会复制切片的元素数组,但它是浅拷贝:值类型元素可独立修改,指针、map 或嵌套切片仍需按字段判断是否共享。本文用代码和边界表说明 Clone、copy 与深拷贝的选择。430 收藏