package main
import (
"fmt"
)
var b int64 = a()
func init() {
fmt.Println("init in main.go ")
}
func a() int64 {
fmt.Println("calling a()")
return 2
}
func main() {
fmt.Println("calling main")
fmt.Println(b)
}
输出为:
calling a()
init in main.go
calling main
2
golang中程序首先加载依赖,加载依赖的顺序为率先加载不依赖别的依赖的依赖,之后加载全局变量,然后执行init()函数,最后是main函数,在函数中加载变量的顺序同加载依赖的方法相同,率先加载不依赖别的变量的变量。
还记得在cobra中,经常用到init这个初始化函数
var versionCmd = &cobra.Command{
Use: "version",
Short: "Print the version number of Hugo",
TraverseChildren: true,
Long: `All software has versions. This is Hugo's`,
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Hugo Static Site Generator v0.9 -- HEAD")
fmt.Println(cmd.Flags().GetString("name"))
fmt.Println(cmd.Flags().GetString("author"))
},
}
func init() {
rootCmd.AddCommand(versionCmd)
var Source string
versionCmd.Flags().StringVarP(&Source, "source", "s", "", "读取文件路径")
var Name string
versionCmd.Flags().StringVarP(&Name, "name", "n", "default name", "你的名字")
}
在这段程序中,首选会加载versionCmd这个变量,之后执行init函数来进行初始化。