-
需手动安装protoc二进制并配置PATH:Windows放%GOPATH%\bin,macOS/Linux放$GOPATH/bin;再用goinstall安装protoc-gen-go和protoc-gen-go-grpc;生成命令须分开指定--go_out和--go-grpc_out,且结构体需嵌入UnimplementedXXXServer。
-
Go在函数调用前通过stackguard0(约8KB安全缓冲区)预判栈是否够用,SP低于它即触发runtime.morestack扩容;若扩至1GB仍不足,则报栈超限错误。
-
WaitGroup必须先Add再go,否则main可能提前退出;Done需每条退出路径都执行,推荐deferwg.Done();不可复用,用完需新建实例;WaitGroup仅用于等待完成,控制退出需配合context或channel。
-
net/http默认ServeMux不适合生产路由管理,因其仅支持前缀匹配,不支持路径参数、方法区分、正则约束及中间件机制,导致路由扩展性差、维护困难且易出错。
-
用gotest模拟并发HTTP请求需启动临时服务并用goroutine发请求,关键在于避免泄漏与阻塞:设超时、用WaitGroup等待、禁用log.Fatal;读多写少用RWMutex,高频计数用atomic;GOMAXPROCS不宜过高,应结合pprof优化;Transport需调优连接复用参数以匹配后端能力。
-
net/http默认长连接不适用于高并发弹幕,因HTTP/1.1串行处理、连接状态维护开销大;应改用WebSocket,配合sync.Map管理连接、单连接限流及Origin校验防攻击。
-
sync.Map仅适用于低频写、高频读且键数量少的场景;频繁增删或大数据量会导致内存上涨和GC压力,应改用gcache等支持TTL和淘汰策略的库。
-
len()返回字符串字节长度而非Unicode字符数,如"你好"返回6;需用utf8.RuneCountInString()获取真实字符数,截取应转[]rune操作避免UTF-8损坏。
-
Go标准库net/http可实现HTTPBasic认证:解析Authorization头中Base64编码的用户名密码,解码后校验;需封装中间件、强制HTTPS、避免日志泄露凭证。
-
http.Post默认不设Content-Type,JSON会被当text/plain导致415错误;须用http.NewRequest+Do并设application/json;json.Marshal错误不可忽略;结构体需jsontag;禁用手写JSON字符串;必须显式设超时。
-
用golang.org/x/time/rate实现令牌桶限流最稳妥标准库不带限流,但官方维护的rate包就是为这设计的——不是玩具,生产可用。它底层是精确的令牌桶(tokenbucket),支持突发流量、可动态调整速率,且无锁(基于time.Now()和原子操作)。常见错误是手动实现计数器+时间窗口,结果在高并发下漏判或误限——比如用map+sync.Mutex存每个IP的最后请求时间,既慢又难保证一致性。rate.NewLimiter(rate.Limit(10),5):每秒
-
Go中处理表单文件上传需先调用ParseMultipartForm解析,再通过*multipart.FileHeader的Open()获取io.Reader读取内容;FileHeader仅含元信息不存数据,须校验Size等基础字段。
-
go-cache初始化必须指定defaultExpiration和cleanupInterval参数,否则不自动清理过期项导致内存泄漏;其API并发安全但需注意引用传递、类型断言及过期延迟清理特性。
-
Go中struct的map字段必须显式初始化,否则直接赋值或json.Unmarshal会panic;key需为可比较类型;嵌套map需注意初始化时机、JSON边界和key约束。
-
本文介绍如何在Go单元测试中,将字符串便捷、高效地封装为符合io.Reader接口的实例,从而替代真实网络连接(如TCP),提升测试的可重复性与执行效率。