main() 函数只能存在一个,但是 init() 函数允许存在多个,且按照出现的先后顺序执行,单文件如下
func init(){
fmt.Println("init")
}
func main() {
fmt.Println("main")
}
func init(){
fmt.Println("ini")
}
其输出结果为
init
ini
main
当路径下右多个文件同时包含了 init() 时,会按照顺序执行每个文件的 init(),如下
ls # 当前路径内容
1.go 2.go go.mod main.go t # t 为 go build 后生成的二进制文件
cat 1.go # 查看 1.go 的内容
package main
import "fmt"
func init(){
fmt.Println(1)
}
cat 2.go # 查看 2.go 的内容
package main
import "fmt"
func init(){
fmt.Println(2)
}
go mod init t # 初始化 go.mod
go build # 构建可执行文件
./t # 运行
1
2
init
ini
main
所以在 leetcode 上可以利用这一特性在内存使用上轻松击败佰分之佰
func init() {
debug.SetMemoryLimit(3 << 20)
}
<< 是二进制移位运算符,3<<20 等价于 3*2^20,即限制内存使用为 3Mb。代价就是程序运行会被频繁的 Garbage Collector(GC) 拖慢速度,单在 leetcode 上,在算法优化到 0ms 时,不妨试试这个邪修。