作者回复: 手动点赞!
作者回复: 问题很好。实测情况是go会先按文件传入顺序,分别初始化常量与变量,然后在分别调用各个文件中的init函数。比如说如果一个pkg1有两个文件file1.go和file2.go,那么初始化顺序是:file1中的常量 -> file1中的变量 -> file2中常量 -> file2中变量 -> file1中init函数 -> file2中init函数。
作者回复: go不允许循环依赖。编译器会检测并报错。
作者回复: 手动点赞!
作者回复: 👍
作者回复: 正确✅
作者回复: init函数没有返回值,异常是通过panic机制传导的,通常导致程序退出。当 init 函数在检查包数据初始状态时遇到失败或错误的情况,通过panic退出是一个多数的选择。
作者回复: 1. init函数不是普通函数,就和main函数一样,编译器会有特殊关照,一个包里有多个init不会出现“init已定义”的编译错误。 2. 至于允许存在多个init,这个没有标准答案。日常实践中,我会将不同类型的初始化操作放在不同init(初始化的“内聚”),同一包内的不同文件的内的初始化,都放在各自文件中,这样代码可读性好一些。
作者回复: gopath模式下肯定不行。go module模式下,检查一下go.mod中module path是否是github.com/bigwhite/prog-init-order?
作者回复: 1. 不可以。main包中定义的main函数也仅能在main包内使用 2. 好建议。 3. 如果标准库中有合适的例子,我会尽量用标准库的。