避免使用 init()
约 471 字大约 2 分钟
2025-09-04
尽可能避免使用init()。当init()是不可避免或可取的,代码应先尝试:
- 无论程序环境或调用如何,都要完全确定。
- 避免依赖于其他
init()函数的顺序或副作用。虽然init()顺序是明确的,但代码可以更改, 因此init()函数之间的关系可能会使代码变得脆弱和容易出错。 - 避免访问或操作全局或环境状态,如机器信息、环境变量、工作目录、程序参数/输入等。
- 避免
I/O,包括文件系统、网络和系统调用。
不能满足这些要求的代码可能属于要作为main()调用的一部分(或程序生命周期中的其他地方), 或者作为main()本身的一部分写入。特别是,打算由其他程序使用的库应该特别注意完全确定性, 而不是执行“init magic”
| Bad | Good |
|---|---|
| |
| |
考虑到上述情况,在某些情况下,init()可能更可取或是必要的,可能包括:
不能表示为单个赋值的复杂表达式。
可插入的钩子,如
database/sql、编码类型注册表等。对 Google Cloud Functions 和其他形式的确定性预计算的优化。
更新日志
2025/9/4 15:48
查看所有更新日志
a059b-新增Uber的Go语言规范于
