我是个新手。当运行几个go文件(包括包、变量和init函数)时,我陷入了初始化顺序。
据我所知,有几条规则:
init函数应该根据它们的外观顺序进行调用。main。有一个例子让我感到困惑(有人告诉我,初始化顺序是由从小数到大数表示的,比如1.1在1.2之前执行,1.2在2.1之前执行等等)。
// p1.go
package p1
import "fmt" //1.1
var x float32 = 1.2 //1.2
func init() { //1.3
fmt.Printf("p1 package, x:%f\n", x) //1.4
}
func Donothing() {
fmt.Println("do nothing.\n")
}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// a.go
package main
import "fmt"
var WhatIsThe1 = AnswerToLife(2.1) //2.1
var WhatIsThe2 = AnswerToLife(2.2) //2.2
var WhatIsThe3 = AnswerToLife(2.3) //2.3
func init() { //3.1
fmt.Printf("init WhatIsThe in a.go `s init 3.1: %d\n", 2)
}
func init() { //3.2
fmt.Printf("init WhatIsThe in a.go`s init 3.2: %d\n", 3)
}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// testinit.go
package main
import "p1" //1
import "fmt"
var WhatIsThe4 = AnswerToLife(2.4) //2.4
var WhatIsThe5 = AnswerToLife(2.5) //2.5
var WhatIsThe6 = AnswerToLife(2.6) //2.6
func AnswerToLife(index float32) float32 {
fmt.Printf("init package level variable, WhatIsThe: %f\n",
index)
return index
}
func init() { //3.3
fmt.Printf("init WhatIsThe in testinit.go`s init3.3: %d\n", 0)
}
func init() { //3.4
fmt.Printf("init WhatIsThe in testinit.go`s init3.4: %d\n", 1)
}
func main() { //4
p1.Donothing() //5
}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// z.go
package main
import "fmt"
var WhatIsThe7 = AnswerToLife(2.7) //2.7
var WhatIsThe8 = AnswerToLife(2.8) //2.8
var WhatIsThe9 = AnswerToLife(2.9) //2.9
func init() { //3.5
fmt.Printf("init WhatIsThe in z.go`s init 3.5: %d\n", 4)
}
func init() { //3.6
fmt.Printf("init WhatIsThe in z.go`s init 3.6: %d\n", 5)
}我对这些事情感到困惑:
main时,它缺少main函数可以吗?main,它们之间的关系是什么?main的初始化顺序是什么?a.go、testinit.go和z.go中执行这些testinit.go函数?发布于 2019-04-12 20:04:50
规格说明说:
一个完整的程序是通过将一个名为主包的未导入的包与它导入的所有包(过渡)链接起来创建的。主包必须具有包名
main,并声明一个不带参数且不返回值的函数main。 (){…} 程序执行首先初始化主包,然后调用函数main。当该函数调用返回时,程序将退出。它不会等待其他的(非主要的)峡谷完成。
注意,主包和名为main的包之间有区别。
main函数。否则,名为main的包中的文件不需要有main函数。main的包没有特殊的状态。main包。只有一个包将满足对主包的要求。https://stackoverflow.com/questions/55658556
复制相似问题