-
Go1.16起GO111MODULE默认on,但仍需手动设为on以确保行为一致;模块路径须按最终import地址预设(如github.com/yourname/mytool),避免简名或本地路径。
-
本文介绍一种无需第三方库的轻量方案,通过封装http.HandleFunc实现请求路径的自动匹配校验,避免手动重复比对req.URL.Path,提升路由处理逻辑的可读性、模块化与DRY性。
-
Go的http.SetCookie设不上,主要是因响应头未发送或被拦截:必须在写body前调用,且需注意代理、SameSite大小写、Secure与本地开发冲突、Path/Domain匹配及credentials配置。
-
拆分服务应基于业务演进节奏与变更影响范围,以限界上下文识别真正独立发布、扩缩容且数据自治的边界;错误拆分将导致“分布式单体”,运维与排查成本激增。
-
Viper默认不自动同步运行时修改的环境变量,只在初始化或AutomaticEnv()首次调用时读取一次;需确保SetEnvPrefix在AutomaticEnv()之前调用,且AutomaticEnv()在ReadInConfig()之后以使环境变量覆盖YAML值。
-
Go中状态码须用const命名而非裸数字,以明确语义、便于搜索重构;应分离HTTP状态码与业务错误码,统一管理、显式类型、配套Text()方法,并通过Is()支持errors.Is()匹配,前端依赖稳定JSON字段名与全大写枚举。
-
Gomultipart.Reader不能直接读大文件,因其非流式设计,会将整个multipart表单缓存进内存导致OOM;需绕过ParseMultipartForm,用mime/multipart手动解析、逐块读取并及时关闭part。
-
net.DialTimeout仅测TCP三次握手延迟,非业务响应延迟,云环境受NAT/SLB/安全组影响大,宜用于healthz探活;真实延迟需用自定义http.Transport+RoundTripper打点,跨地域强制MaxIdleConnsPerHost=1,监控用直方图分桶+histogram_quantile按region聚合。
-
单纯加Timestamp不足以防重放,因其易被截获重发;需配合全局唯一且一次有效的Nonce(推荐crypto/rand生成+Redis原子判重),并确保timestamp与nonce校验顺序合理、生命周期咬合。
-
因为需控制渲染逻辑、集成内部CMS、统一元信息格式,现成工具插件机制反而更重;Golang的html/template和文件遍历能力足以构建轻量静态生成器,核心是“轮子必须听你指挥”。
-
Go中if后初始化语句必须用小括号包裹且仅限一条,如ifx:=getValue();x>0{…};elseif实为else后接if,换行会因隐式分号导致编译失败;nil需显式比较;短变量声明:=在if中仅允许一次。
-
Go模块升级需遵循语义化版本规范,使用goget指定版本并运行测试验证兼容性,主版本升级时注意路径变更和API破坏性修改,通过replace调试及gomodtidy维护依赖整洁,确保升级安全可控。
-
Go语言虽无三元操作符,但可通过if短变量声明、泛型函数ifElse、切片索引映射或省略else的直接返回等方式实现类似简洁逻辑,结合清晰结构平衡可读性与简练性。
-
Go中同类型指针用==比较是安全的,仅比较地址值而非内容,nil指针可与同类型指针比较;但不可用于判断逻辑相等,结构体指针应避免依赖==判断业务等价性。
-
Golang实现WebSocket实时通信需用gorilla/websocket库,核心是通过ClientManager结构体(含clientsmap、broadcast/register/unregisterchannel及sync.RWMutex)统一管理连接并安全广播;HTTP升级须用websocket.Upgrader并校验origin。