首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Go语言初始化(执行)顺序的问题

关于Go语言初始化(执行)顺序的问题
EN

Stack Overflow用户
提问于 2019-04-12 19:48:49
回答 1查看 54关注 0票数 0

我是个新手。当运行几个go文件(包括包、变量和init函数)时,我陷入了初始化顺序。

据我所知,有几条规则:

  1. 导入的包和init函数应该根据它们的外观顺序进行调用。
  2. 如果A文件导入文件B而B文件导入文件C,则初始化顺序为C->B->A。
  3. 依赖关系总是首先执行的。
  4. 最后总是执行包main

有一个例子让我感到困惑(有人告诉我,初始化顺序是由从小数到大数表示的,比如1.1在1.2之前执行,1.2在2.1之前执行等等)。

代码语言:javascript
复制
// 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")
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

代码语言:javascript
复制
// 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)

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

代码语言:javascript
复制
// 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
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

代码语言:javascript
复制
// 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)

}

我对这些事情感到困惑:

  1. 当一个文件声明包main时,它缺少main函数可以吗?
  2. 如果有多个包main,它们之间的关系是什么?
  3. 我从Python、Javascript等其他语言中知道,应该有一个“主文件”。围棋的语言怎么样?
  4. 所有包main的初始化顺序是什么?
  5. 我对序列2.1 ~ 2.9感到困惑,为什么它们是按顺序执行,而不是在文件a.gotestinit.goz.go中执行这些testinit.go函数?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-12 20:04:50

规格说明说:

一个完整的程序是通过将一个名为主包的未导入的包与它导入的所有包(过渡)链接起来创建的。主包必须具有包名main,并声明一个不带参数且不返回值的函数main。 (){…} 程序执行首先初始化主包,然后调用函数main。当该函数调用返回时,程序将退出。它不会等待其他的(非主要的)峡谷完成。

注意,主包和名为main的包之间有区别。

  1. 如果包文件,主包必须有一个main函数。否则,名为main的包中的文件不需要有main函数。
  2. 程序执行从上面定义的主包开始。其他名为main的包没有特殊的状态。
  3. 可以有多个main包。只有一个包将满足对主包的要求。
  4. 包初始化顺序取决于包之间的导入关系。在确定初始化顺序时,任何包的名称都不起任何作用。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55658556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档