-
最常用且简洁的是time.Since()或time.Now().Sub();需高精度或分段计时则手动记录起点再调Sub();time.Elapsed()并不存在。
-
Go中包名重复、依赖版本冲突、本地模块替换及同名包导入区分问题:同一目录下package声明须一致;logrus多版本需用replace或别名;本地包用replace指向含go.mod的路径;同名包导入须加别名。
-
使用t.Run可为测试用例命名并独立运行,便于定位错误。它支持子测试层级结构,结合表格驱动测试能清晰组织多个场景,提升可维护性,是Go测试的标准实践。
-
RPC方法签名无法直接校验参数,需提前拦截;Go标准net/rpc强制方法签名为func(Args,Reply)error,仅保证调用成功(序列化、网络、panic),不校验业务参数合法性。
-
Go服务无内置CPU/内存硬限,需依赖cgroups等外部机制;Docker中应设--cpus和--memory并禁用GOMAXPROCS环境变量,K8s需注意cgroupv1精度问题及大页影响。
-
Go中“代理+单例”模式通过sync.Once实现线程安全懒汉单例,并用代理函数或DBProxy结构体封装访问逻辑,注入权限校验、限流、日志等控制行为,确保全局唯一实例且对外统一可控。
-
Go语言中使用html/template包渲染Web页面时,需避免重复解析、缓存模板、减少数据拷贝并启用压缩。首先通过template.Must全局缓存已编译模板,避免每次请求解析;其次定义专用ViewModel传递最小化数据,并在初始化阶段完成格式化处理;再通过预解析和显式组合模板提升执行效率;最后结合Gzip或Brotli压缩中间件减小传输体积。合理设计下可实现单机每秒数千次渲染。
-
缓存代理能减少重复调用、降低后端压力并提升响应速度,其设计基于接口实现,通过复用接口代理结构体避免修改原始逻辑;1.定义与接口一致的代理结构体并封装原始对象及缓存;2.缓存键通常由方法参数构成,需保证唯一性;3.缓存过期策略可选固定时间或引入外部库控制;4.性能优化包括使用sync.Pool减少GC压力、并发安全处理、选择热点方法缓存、限制缓存条目防止内存爆炸;5.还需考虑缓存穿透问题,如缓存空值或布隆过滤器预判。
-
Go中的引用类型包括slice、map、channel、interface、指针和函数类型,它们传递时复制指针副本但不复制底层数据,因此函数内可修改共享数据却无法更改原引用变量本身,如需修改则需传指针。
-
Go中值类型赋值必复制内存,int、struct等按语义完整拷贝;大结构体(>128字节)应显式传指针;map/slice/channel赋值仅拷贝头信息;接口赋值会连同大值一起拷贝,需警惕性能开销。
-
Go语言虽无类继承和装饰器语法糖,但可通过函数类型、高阶函数与接口实现装饰器模式:定义HandlerFunc类型,编写WithLogging、WithRetry等装饰器函数,支持链式组合与context增强,以轻量、非侵入方式添加横切逻辑。
-
在Golang中处理IO操作错误的关键在于识别和区分不同类型的错误。1.os.PathError用于路径相关错误,包含操作名、路径和底层错误,处理建议检查路径拼写、权限及用户输入校验;2.os.IsNotExist和os.IsPermission用于快捷判断文件不存在或权限问题,提升代码可读性并便于提供友好提示;3.os.SyscallError封装系统调用错误信息,包括调用名称和错误详情,处理建议检查权限设置、端口冲突等运行环境问题;此外,错误处理应遵循不忽略错误、具体化错误信息、统一处理逻辑及测试边界
-
应根据是否需修改原值及结构体大小选择:必须用指针接收器以修改字段或处理大结构体(>8–16字节);小结构体或纯函数式方法可用值接收器;注意逃逸、GC压力与sync.Pool复用陷阱。
-
Go中goroutine泄漏主因包括channel阻塞、未关闭channel、无限循环无退出及子goroutine未随父退出;2.通过pprof监控goroutine数量可检测泄漏;3.使用context控制生命周期,如WithCancel发送取消信号,确保goroutine及时退出。
-
gzip.Writer默认用level6压缩率偏低,应按需选BestSpeed(1)或BestCompression(9);需复用sync.Pool、手动处理Accept-Encoding/Content-Encoding、正确设置缓冲顺序(bufio→gzip)、调用Close()确保trailer完整。