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