-
本文介绍如何在Go中通过预过滤机制,避免将空嵌入结构体(如Problem{})序列化为JSON中的空对象{},从而实现任意组合非空结构体并生成紧凑、合规的JSON数组。
-
Go切片传参时传递的是包含ptr、len、cap的结构体副本,ptr值被复制但指向同一底层数组;修改元素生效,append等操作需返回新切片才能影响调用方。
-
不能直接将reflect.Value转为reflect.Type,只能通过v.Type()提取其绑定的类型;reflect.Type无法反向生成reflect.Value,需用reflect.New(t).Elem()创建新值。
-
json-iterator更快是因为绕过反射、预编译解析逻辑、支持零拷贝字符串读取,但仅在结构体稳定、字段固定且高频解析场景下优势显著;动态map或深层interface会削弱性能,甚至更慢。
-
Go标准库log不支持日志轮转,需用第三方库:lumberjack适合按大小轮转(如100MB/个,保留7个+28天),file-rotatelogs适合按日期轮转(如daily,带软链和精确时间控制)。
-
GoWorkspaces是专为本地多模块联动开发设计的机制,用于替代replace的临时方案;需在含go.mod的目录用goworkinit初始化,仅在Go1.18+且存在go.work文件时生效,不参与构建发布流程。
-
fstest.MapFS不能直接写入,因为它是只读的,仅实现fs.FS而非fs.ReadWriteFS,调用写操作会panic;适合只读测试场景,写入需换用memfs或afero等可写内存文件系统。
-
应使用context.Context透传traceID:入口从请求头提取ID并用自定义key注入ctx,下游调用显式传递该ctx;日志通过WithContext动态提取traceID,避免With频繁创建logger实例;gRPC/HTTP混合调用需手动处理metadata和header传递。
-
使用长连接替代短连接,通过Keep-Alive和gRPC的*grpc.ClientConn复用TCP连接;2.控制连接数量与并发度,设置最大空闲连接数并用信号量隔离不同服务;3.实现健康检查与自动重连,在Put前检测连接状态并重建失效连接;4.结合上下文超时控制,使用context.WithTimeout限制调用时间并释放资源。需持续压测调优以平衡性能与资源。
-
一个有效的go.mod文件最小合法结构是module声明和go版本声明两行;module指定模块路径,go指定最低Go版本,二者缺一不可,否则构建报错。
-
Go语言原生支持多返回值,可同时返回不同类型值,常用于结果与错误组合;支持命名返回参数以提升可读性,但需显式赋值避免零值误用;调用时须严格匹配个数与类型,下划线可忽略不需要的返回值。
-
Go编译器因无法确定包初始化顺序而拒绝编译import循环;解法包括:抽取公共类型至独立types包、用接口+依赖注入替代直接调用、警惕\_导入和init()引发的隐式循环。
-
享元模式通过共享内部状态减少对象内存开销,适用于大量相似对象场景。1.区分内部(如颜色、型号)和外部状态(如位置)。2.使用工厂缓存共享对象,避免重复创建。3.Go中用sync.Once和map实现线程安全的享元池。4.外部状态由调用方传入,不保存在享元对象中。5.适合配置重复率高的场景,避免每个对象独立存储相同数据,显著降低内存使用。
-
测通错误路径的核心是让依赖返回指定error并验证调用方响应,需接口抽象+可控mock、避免直接赋error、用errors.Is/As判断错误、表驱动覆盖多分支、检查副作用,慎用testify/mock。
-
Go开发环境核心是gopls运行、go.mod识别和dlv调试三要素;缺一不可,否则补全失效、跳转报错、断点灰掉。