Go问答技术文章
-
Go 服务收到停机信号后仍有请求进入,通常是监听器尚未关闭或摘流量与停机之间存在窗口。本文用 draining、显式 Listener 和 Server.Shutdown 完整处理。232 收藏 -
Go 中同一算法只因数据类型不同而重复时适合使用泛型;不同类型需要不同方法实现、调用方只关心行为时更适合接口。本文用 Map 与 io.Reader 对比,并给出四项选择检查。230 收藏 -
Go workspace 中,go.work 的 go 与 toolchain 指令负责 workspace 启动时的工具链要求;每个 go.mod 的 go 指令仍决定对应模块的最低版本和语言语义。go.work 的版本不能低于任何 use 模块。230 收藏 -
strings.EqualFold 按 Unicode 简单大小写折叠直接判断两个 UTF-8 字符串,而 strings.ToLower 是把字符单向映射成小写。本文用希腊 Sigma、德语 ß 和组合字符说明两者差异、适用场景与工程边界。229 收藏 -
go generate 默认在包含指令的 Go 包源目录运行。本文从工作目录、相对路径、环境变量和模块根目录入手,排查命令找不到、输入为空与生成文件落错位置等问题。229 收藏 -
Go 官方建议不要把 Context 保存进结构体,因为请求级取消、deadline 和值的生命周期会被对象复用混在一起。本文用按调用传递、生命周期检查和 net/http 兼容性例外说明该规则的边界。227 收藏 -
go build -trimpath 会移除可执行文件中的本机文件系统路径,但不会自动删除调试符号。本文用最小示例拆解它对堆栈、源码导航、CI 可复现构建和生产发布的影响,并给出按场景选择构建参数的方法。224 收藏 -
本文解释 Go EvalSymlinks 为何要求路径组件真实存在,并给出现有路径、断链与待创建目标的正确处理方式。223 收藏 -
Go Resolver.LookupHost 返回的是本地解析器得到的地址切片,不是稳定的主备顺序。容器中的 resolv.conf、hosts 文件、Go/cgo 解析路径和 IPv4/IPv6 排序条件不同,就可能让结果顺序变化。本文给出对照排查和应用层稳定选择方案。223 收藏 -
Go 模板遇到缺失数据时可继续输出、返回元素零值或立即报错。本文解释 missingkey 三种策略、map 与 struct 的边界,并给出严格渲染、缓冲输出和表驱动测试方案。 223 收藏 -
slog.LevelVar 在单进程内并发安全且会被 Handler 每条记录读取。动态修改只影响部分请求,通常是 Logger/Handler 未共享同一 LevelVar、存在双重过滤,或多实例只更新了一个进程。223 收藏 -
Go 1.21 以后 toolchain 会依据 go.mod、go.work 和 GOTOOLCHAIN 选择版本。本文说明离线环境如何区分自动下载、PATH 预装和版本要求,并给出不触发网络下载的配置与验证清单。223 收藏 -
Go 1.26 新增的 errors.AsType 用泛型返回具体错误类型,省掉 errors.As 中声明目标指针和传入地址的样板写法。本文说明包装错误、自定义 As、errors.Join 与旧版本兼容边界。221 收藏 -
Go 的 runtime.SetFinalizer 只在对象不可达后安排清理,函数里的最后一次使用不一定能把对象保活到系统调用结束。本文用非内存句柄场景拆解对象可达性、runtime.KeepAlive 的放置位置、finalizer 的边界与工程选型。221 收藏 -
解释 Go sql.DB.Stats 中 WaitCount 持续增长的含义,区分连接池等待、数据库变慢和资源未释放,并给出窗口采样与参数排查方法。220 收藏