-
Go程序启动错误无法通过main()返回值捕获,必须在main()内显式处理;init()中panic会立即终止程序;os.Exit()跳过defer导致资源泄漏;第三方库init()需主动验证。
-
Go服务通过Docker多阶段构建实现可移植性:用golang:alpine编译,scratch或alpine运行,静态链接+裁剪符号,非root用户+健康检查,CI中多架构构建并规范tag。
-
需用真实网卡和IP模拟网络拓扑:通过net.Interfaces()获取网卡,iface.Addrs()提取IPNet并过滤回环地址,节点绑定指定网卡IP+端口;启用IP转发与iptables;用gob序列化带Header的Packet结构体;以time.NewTimer+select控制节点节奏。
-
go.mod应按发布/复用意图设在各独立模块根目录,如主应用cmd/api、可导出组件pkg/storage;internal下不可设模块;import路径须严格匹配module声明值,跨模块依赖需显式gomodtidy或replace。
-
http.Server需显式配置超时与连接复用:ReadTimeout/WriteTimeout设5–10秒,IdleTimeout设30–60秒以复用连接,MaxHeaderBytes防内存耗尽。
-
Go服务需通过/metrics端点暴露Prometheus指标,使用prometheus/client_golang库定义并注册指标,用promhttp.Handler()挂载;避免注册冲突、并发不安全操作及高基数标签导致的内存泄漏。
-
Golang中HTTP客户端默认自动跟随3xx重定向,最多10次,通过http.Client的CheckRedirect字段可自定义行为,如限制次数、校验目标域名或禁用重定向,避免安全风险与性能问题。
-
必须先调用r.ParseForm()解析普通表单,或r.ParseMultipartForm(32<<20)解析含文件的表单,否则r.PostFormValue返回空;标准库不自动解析POST表单。
-
推荐使用go-playground/validator通过结构体标签统一校验请求参数,避免手写if判断;需封装错误格式化函数返回字段级友好提示;query和body应分结构体处理,支持自定义规则且须保证可测试、无业务耦合。
-
Context.WithValue会掩盖参数来源,使调用链变成难以追踪的“黑盒”;它应仅用于传递请求元数据(如traceID),而非业务参数,且key必须为私有类型、取值需双判断,避免panic和性能损耗。
-
Go中指针本身不并发安全,需保护被指针访问的底层数据;多goroutine读写同一变量须用锁、原子操作或channel;atomic.Value适合写少读多的指针发布场景。
-
switch后不写表达式时判断每个case布尔表达式的真假,从上到下执行首个为true的分支;case多值用逗号分隔因是匹配值列表而非逻辑或;fallthrough无条件跳入下一case体;typeswitch仅支持类型名匹配且不可与值匹配混用。
-
拆分服务应基于业务演进节奏与变更影响范围,以限界上下文识别真正独立发布、扩缩容且数据自治的边界;错误拆分将导致“分布式单体”,运维与排查成本激增。
-
Go并发下载需限制goroutine数量并配置http.Client:设MaxIdleConns/PerHost、用channel控并发、每任务独立context.WithTimeout、写文件须隔离路径或加锁,优先用io.Copy确保健壮性。
-
最稳妥的GoWebAPI版本控制方式是URL路径分版本(如/v1/users)。因Header方式导致调试困难、缓存混乱、中间件兼容性差;路径方式支持独立路由树、Nginx分流、清晰语义隔离;废弃旧版本需渐进式返回410/426并监控,而非简单删除或重定向。