-
用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并控制生命周期,避免泄漏。
-
Go内存模型关注goroutine间读写可见性而非存储位置;不靠同步原语无法保证安全;happens-before是定义操作先后关系的规则,非时间概念,如channel通信建立该关系。
-
Go标准日志的log.Fatal默认显示日志语句所在行号,而非错误发生处;通过runtime.Caller(1)可获取调用者(如main中)的文件名与行号,并结合自定义logger实现行号“透传”。
-
用chanstruct{}传信号最轻量,因struct{}零大小、零开销;避免用chanbool/int传true/1,以防语义误解和GC压力,且易在select中因缺default导致阻塞。
-
go.work是显式声明的本地开发上下文,需置于所有模块最近公共父目录,use路径须为相对路径,命令须在根目录执行或指定-workfile,子模块go.mod中replace会覆盖工作区配置,且CI/CD不启用工作区。