-
应使用AC自动机而非strings.Contains或正则:前者时间复杂度O(n),支持高效多模匹配;后者分别为O(n×m)和易回溯、编译慢、内存暴涨。
-
GoogleAppEngine生产环境中,User.ID是不可预测长度的字符串,常超过int64表示范围(±9,223,372,036,854,775,807),强行用strconv.ParseInt(...,10,64)解析会导致“valueoutofrange”错误;应始终将其作为字符串处理。
-
使用高性能第三方库如json-iterator/go或goccy/go-json替代标准库,结合预定义结构体和sync.Pool内存复用,可显著提升Golang中JSON处理性能。
-
默认http.Server响应慢主因是未调优的连接复用、TLS开销、WriteHeader时机不当、日志阻塞及无缓冲ResponseWriter;必设ReadTimeout、WriteTimeout、IdleTimeout和ConnState回调优化,可提升20%+P95延迟。
-
用iota定义日志级别常量简洁可读、支持比较与字符串映射;配合自定义类型Level和String()方法实现类型安全与友好输出;天然支持阈值判断、配置解析和扩展(如Trace、预留值、起始偏移)。
-
Go中map不能直接交换键,必须手动读取两键值后互写;若键不存在需提前检查,避免误删或竞态;键重命名则需遍历并统一替换。
-
goroutine启动开销不大,但滥用“一请求一goroutine”会加剧GC压力和调度负担;应优先用channel+workerpool替代;GOMAXPROCS调高反增上下文切换;channel缓冲区需按场景设定,非越大越好。
-
应使用errors.Is或errors.As判断错误类型,避免直接比较error字符串;封装断言函数区分“必须无错”和“必须有特定错”;注意错误链完整性、堆栈可见性及Error()字符串的脆弱性。
-
Go中字符串拼接应避免循环使用+=,因其引发指数级内存分配与拷贝;推荐用strings.Builder配合Grow预分配,性能可提升200倍以上。
-
Go1.18原生支持fuzz测试,通过提供Fuzz开头的测试函数、合理种子及避免提前recover,可高效发现崩溃类缺陷;运行gotest-fuzz后崩溃输入存于fuzz/crashers/并自动最小化。
-
os.Copy仅复制文件内容,不保留元数据,适合轻量内容备份;需手动补全权限、时间等;目录遍历用filepath.WalkDir并处理symlink与权限错误;增量备份应先比对Size/ModTime再局部哈希;恢复时优先原子替换临时文件。
-
merge函数应分三段处理:①双指针比较填入;②左子数组剩余全拷;③右子数组剩余全拷;参数统一为arr[]int,left,mid,right(闭区间),避免越界和漏元素。
-
Go无内置向量相似度搜索,需依赖第三方库(如faiss-go、lance-go)或自行实现暴力遍历+余弦相似度;前者适合大规模低延迟场景,后者适用于小规模可控场景。
-
使用Docker多阶段构建可显著减小Golang应用镜像体积。1.因Golang编译后为静态二进制,运行时无需依赖,但构建需完整环境,多阶段构建通过分离构建与运行阶段,仅将编译产物复制至轻量基础镜像(如alpine或scratch),实现镜像精简。2.典型Dockerfile包含builder阶段(基于golang镜像编译)和runtime阶段(基于alpine运行),通过CGO_ENABLED=0生成静态文件,利用层缓存优化构建速度。3.进阶优化包括使用scratch或distroless镜像、添加-l
-
Go中nil切片与空切片行为不同:前者data指针为nil,后者data指向有效地址;应统一用len(s)==0判空,而非s==nil;goroutine需绑定context并控制生命周期,避免泄漏。