在 Go 中,您可以init
在给定的包中定义多个函数,所有这些函数都将在执行之前以未指定的顺序运行。拥有多个此类函数的一个后果是无法在普通代码中调用或识别它们。例如,以下将无法编译:
func main() {
fmt.Println(init)
}
func init() { }
(请参见此处的 Go 游乐场示例)我的问题是 - 能够拥有多个 init 函数有什么好处,如果没有多个 init 函数,我们是否能够引用或调用 init 函数?
在 Go 中,您可以init
在给定的包中定义多个函数,所有这些函数都将在执行之前以未指定的顺序运行。拥有多个此类函数的一个后果是无法在普通代码中调用或识别它们。例如,以下将无法编译:
func main() {
fmt.Println(init)
}
func init() { }
(请参见此处的 Go 游乐场示例)我的问题是 - 能够拥有多个 init 函数有什么好处,如果没有多个 init 函数,我们是否能够引用或调用 init 函数?
能够拥有多个功能的优势在于 IMO 主要是它提高了局部性的可读性:如果您必须将所有功能init
集中到一个,您可以在正在初始化的东西旁边编写初始化函数,而不是远程编写。init
顺便说一句,其中甚至可能在不同的源文件中。
init
也可能禁止使用假设的 per-package-single 函数的函数指针。原因是,在某些情况下,拥有这样的指针将允许init
“乱序”调用函数,即。在运行其依赖项之前 -init
其他包中的其他功能。那会破坏某些保证。