Go语言技术文章
-
用 Go 的 io.Pipe 把数据生产、gzip 压缩和 HTTP 请求体串成流,讲清同步背压、错误传播、取消处理以及 Content-Length 和重试边界。249 收藏 -
Go 的 range 循环里取变量地址,是否重复取决于循环变量是用 := 声明还是用 = 复用,以及模块采用的 Go 版本。本文用切片副本、切片元素地址和旧版本兼容写法说明如何判断与修复。501 收藏 -
Go 中需要把多个文件、字符串或网络输入按顺序交给同一个消费函数时,可以用 io.MultiReader 组成连续输入流。本文说明顺序读取、EOF、非 EOF 错误和底层资源关闭责任。426 收藏 -
Go 切片 append 后原切片数据也变化,通常是因为新切片仍复用了容量范围内的底层数组。本文用 len、cap 和三切片表达式判断复用边界,并比较 append 隔离与 copy 深度复制的选择。291 收藏 -
用 Go 包装 io.Reader,在不把整文件读入内存的前提下统计上传过程中已经读取的字节数。本文区分 Reader 进度、网络发送和服务端落盘边界,给出并发读取进度、失败重试与未知总大小的处理方式。127 收藏 -
Go 接口装入 typed nil 后为什么不等于 nil?本文用静态类型、动态类型和动态值拆开接口语义,解释 error 返回中的常见陷阱,并给出类型断言、反射与 API 边界的处理清单。113 收藏 -
Go 的 bufio.Scanner 默认有 token 缓冲上限。本文用长日志场景说明如何在第一次 Scan 前调用 Buffer,如何检查 Err,以及什么时候应该换用 bufio.Reader。140 收藏 -
Go 的 nil 指针接收者不一定一调用就 panic:方法可以先进入方法体,但字段解引用、值接收者和 nil 接口会形成不同边界。本文用最小示例拆开这些情况,并给出排查清单。179 收藏 -
Go 读取 CSV 时,字段中的逗号和换行必须放在双引号内,并交给 encoding/csv.Reader 解析。本文说明如何保留完整字段、区分列数错误与 ParseError,以及何时不该使用 LazyQuotes。157 收藏 -
Go map 多个 goroutine 同时读取通常没有读写冲突,但隐藏的刷新、延迟初始化或元素内部变更仍会触发数据竞态。本文用 RWMutex、race detector 和不可变快照拆清边界。207 收藏 -
面对超大 JSON 数组,不要先读成 []byte 再 Unmarshal;用 json.Decoder 从 io.Reader 逐项 Decode,并为输入总量和单个元素设置清晰边界。160 收藏 -
Go exec.Command 使用裸程序名时会经过 PATH 查找,Go 1.19 起不会隐式执行当前目录中的程序。本文说明 ErrDot 原因、显式相对路径写法,以及 Dir、PATH 和兼容处理的区别。194 收藏 -
Go html/template 复用页头、页脚和基础布局,关键是拆分 layout、partial、page 三类模板,用 embed.FS 配合 template.ParseFS 解析,再通过 block 注入页面正文。193 收藏 -
Go 导入 internal 包报 use of internal package not allowed,通常是调用方不在 internal 上方共同祖先的路径树中。本文用 go.mod、go list 和目录布局说明判断方法,并比较保留 internal、调整共同祖先与移动到公开包的修复选择。330 收藏 -
用 Go 编写长时间运行的命令行任务时,signal.NotifyContext 可以把 Ctrl+C 或 SIGTERM 转成 Context 取消信号;本文演示如何停止新任务、保存最后一个完整检查点,并在下次启动时继续。325 收藏