Go语言技术文章
-
讲清 sha256.New、io.Copy、hash.Hash.Sum 与 Reset 的组合,处理流式摘要、读取错误和状态复用边界。172 收藏 -
crypto/rand.Int 返回 [0,max) 范围内的均匀安全随机整数,但 max <= 0 会触发 panic。本文从上界边界、big.Int 构造、错误处理和取模偏差四个角度给出可直接复用的 Go 写法。241 收藏 -
Golang · Go教程 | 3天前 | 标准库 · 单元测试 · TLS · Go教程 · Go Go标准库 HTTP测试 NewServer testing/httptest NewTLSServer TLS测试
testing/httptest 的 NewServer 适合普通 HTTP 回环测试,NewTLSServer 用于确实需要 HTTPS、证书信任或 TLS 配置的场景。本文用同一 Handler 对比两者的请求写法、客户端选择、配置时机和资源清理边界。276 收藏 -
Golang · Go教程 | 3天前 | 标准库 · 源码分析 · Go教程 · Go ast go/ast go/types parser.ParseFile ast.Ident ast.NewIdent 源码生成
Go ast.NewIdent 用一个名称创建 *ast.Ident,适合拼装源码生成所需的标识符节点。本文从一次位置为空的故障复盘出发,说明 Name、Pos/End、Obj 分别代表什么,以及什么时候应该改用 parser.ParseFile、token.FileSet 和 go/types。268 收藏 -
通过 Visitor 返回值掌握 Go ast.Walk 的深度优先遍历、子树裁剪与 Visit(nil) 退出通知,完成一个跳过函数体的源码分析示例。171 收藏 -
Golang · Go教程 | 3天前 | 并发 · 标准库 · Go教程 · 性能排查 · Go Goroutine context runtime/trace trace.Log trace.NewTask trace.WithRegion
runtime/trace 中,trace.NewTask 建立跨 goroutine 的逻辑任务,trace.WithRegion 记录当前 goroutine 的时间区间,trace.Log 写入同一任务的一次性事件。本文用同一个 context 把三者对齐,并梳理日志缺失、region 归属错误和高基数命名的常见根因。404 收藏 -
Go go/constant.MakeFromBytes 按小端二进制表示把字节切片构造成整数常量。本文说明字节顺序、空切片、高位零字节与低位零字节的区别,并演示如何用 Int64Val 检查结果是否能精确转换为 int64,以及 Bytes 返回绝对值小端字节的边界。247 收藏 -
本文围绕 encoding/csv Reader.InputOffset 说明当前输入流字节偏移的含义,给出成功读取后保存进度、定位解析错误以及从记录边界继续读取的简洁写法。250 收藏 -
Go ast.IsExported 只判断名称的首个 Unicode 字符是否为大写字母。本文说明如何在 AST 遍历中读取 ast.Ident.Name,比较包函数、节点方法与 token.IsExported,并梳理空名称、非法输入、Unicode 和类型可见性的边界。234 收藏 -
围绕 Go unique.Make 与 Handle[T] 说明可比较值的规范化、相等判断、Value 取值和生命周期边界,给出带中文注释的最小实现与采用清单。261 收藏 -
Go 的 sort.Slice 不保证相等元素保持原始顺序,sort.SliceStable 会保留这种相对顺序。本文从业务语义、多关键字排序和基准测试三个角度说明何时值得使用稳定排序,以及它的原地修改和比较函数边界。141 收藏 -
Golang · Go教程 | 3天前 | 切片 · 标准库 · 性能 · 内存管理 · Go教程 · Go 切片删除 slices.DeleteFunc slices.Delete 尾部清零 slices 引用释放
slices.Delete 与 DeleteFunc 都会原地整理切片并返回新的切片头。本文围绕指针元素和含引用字段的场景,说明为什么要接住返回值、为什么尾部清零能避免无效引用继续被底层数组持有,以及手写删除逻辑时应该补足哪些生命周期责任。490 收藏 -
maps.Clone 会保留 nil map 的状态,而 maps.Copy 只向已有目标写入。本文比较 nil 与空 map 的结果,说明 nil 源、nil 目标和非空源组合下的行为,并给出安全选择方式。460 收藏 -
atomic.Uint64 与普通 uint64 可以在同一项目中共存,但同一个共享值不能混用原子读写和直接读写。本文说明类型边界、数据竞争、32 位对齐和首次使用后不可复制的处理方式。403 收藏 -
sync.Pool 取出的对象不一定是新对象,Get 也可能把池视为空并调用 New。本文用 bytes.Buffer 说明为什么要在 Get 后重新初始化业务状态、在 Put 前清理临时数据,以及怎样划分调用方持有边界。471 收藏