-
应使用golang.org/x/sys/unix调用Setrlimit,在Cmd.Start()后、Cmd.Wait()前设置子进程的RLIMIT_CPU(秒级)和RLIMIT_AS(字节级)限制;需配合SysProcAttr.Setpgid=true确保进程组内继承,且软限制不得超过硬限制。
-
Go泛型Map函数应写为funcMap[T,Uany](s[]T,ffunc(T)U)[]U,预分配切片避免append扩容,注意类型别名不兼容及错误处理需回归for循环。
-
递归DFS必须传visitedmap[string]bool以防止环导致无限递归;栈需用切片正确pop避免panic;返回bool实现早停;树DFS需判nil,图DFS环检测不可省。
-
Go不支持真正的全局常量,但可通过点导入或统一错误包等方式实现跨包访问;然而直接省略包名会损害可读性与可维护性,推荐使用语义化错误类型或带前缀的常量导出。
-
Go的http.Client默认不重试,需手动实现带指数退避的重试逻辑;必须检查err!=nil,因网络错误(如timeout、connectionrefused)导致resp为nil,直接访问StatusCode会panic;可重试判断应基于net.Error.Temporary()或context.DeadlineExceeded。
-
Go中标识符导出仅取决于首字母是否为Unicode大写,小写字段、函数、方法、接口及嵌套结构体内部未导出成员在包外均不可见,跨包调用报undefined错误常因未大写命名所致。
-
Go编译器在能静态证明索引安全时自动消除边界检查,否则保留;推荐用fori:=ranges、预提长度配合//go:nobounds(慎用)、或unsafe.Slice(需满足非nil、长度准确、地址有效)来优化。
-
gopsutil的process.Process实例不能直接复用,因其字段为创建时快照,需显式调用p.Refresh()才能更新状态,否则CPUPercent()等方法返回错误值或-1.0;批量处理时须先校验pp.IsRunning()防止“nosuchprocess”错误。
-
最推荐使用github.com/goburrow/serial:API简洁、无CGO依赖、全平台支持、错误处理清晰;需显式配置Address、BaudRate等参数,读写阻塞需配合context或goroutine控制超时,Linux权限问题须加dialout组。
-
可执行程序需满足packagemain且含funcmain();库代码为非main包名,导出符号首字母大写;cmd/子目录下packagemain才是真实入口。
-
应使用errors.Is()判断syscall错误,因Go1.19+对errno做了平台别名映射,直接==失效;跨平台文件锁需按系统分支实现,Flock仅适用于Unix系统,Windows需用LockFileEx;CGO使用需显式构建约束并管理头文件;路径、换行符、shell调用等细节必须跨平台适配。
-
在Golang中使用反射会带来性能损耗和类型安全风险,因此应谨慎使用。反射在运行时通过interface{}获取类型信息,需额外处理步骤,导致比直接操作慢几倍甚至几十倍,且无法被编译器优化。类型判断与转换、方法调用均耗时,错误只能在运行时暴露,如方法名拼写错误、参数类型不匹配等。维护和调试复杂度高,问题难排查。但在配置映射、ORM框架、测试工具等场景中,反射的便利性可接受其代价,可通过缓存类型信息优化性能。总结:1)避免在性能或稳定性要求高的地方使用;2)确需动态处理时合理封装并限制使用范围。
-
Go中mock外部依赖的核心是面向接口编程与依赖注入:先定义小而专注的接口,再通过构造函数注入接口实现,测试时传入可控的mock实现;复杂场景可用testify/mock,HTTP用httptest.Server,数据库用sqlite内存模式或sqlmock,时间用可注入函数变量。
-
Go中goroutine启动后不阻塞主函数,主函数退出则所有goroutine强制终止;需用sync.WaitGroup等待或time.Sleep临时观察,且循环中传参避免闭包陷阱;channel使用不当易致泄漏或死锁。
-
JWT的exp字段被忽略主因是未检查token.Valid或未启用时间校验;Go中需显式调用token.Valid并配置jwt.WithExpirationRequired(),同时确保系统时间同步。