英文:
Go main function not operated first
问题
package main
import (
"bytes"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"os"
"os/signal"
"strings"
"unicode/utf8"
"sync"
"github.com/robfig/cron"
cpu "github.com/shirou/gopsutil/cpu"
"fmt"
)
const NumofResource = 4
// 结构体
type HostInfo struct {
Hostid string
}
var c *cron.Cron
var lastCPUTimes []cpu.TimesStat
func main() {
fmt.Println("1.main.go > main() start")
defer l4g.Close()
var err interface{}
lastCPUTimes, err = cpu.Times(false) //nil
fmt.Println("2.main.go > err", err)
fmt.Println("3.main.go > lastCPUTimes", lastCPUTimes)
if err != nil {
l4g.Error(err)
}
}
我知道main函数首先被执行。
然而,我们确认了名为cpu_windows.go的库首先被执行。
为什么?
cpu_windows.go: Times(bool) false
cpu_windows.go: common.ProcGetSystemTimes.Call 1
cpu_windows.go: Times(bool) true
cpu_windows.go: return perCPUTimes()
1.main.go: main() start
cpu_windows.go: Times(bool) false
cpu_windows.go: common.ProcGetSystemTimes.Call 1
2.main.go: err
英文:
package main
import (
"bytes"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"os"
"os/signal"
"strings"
"unicode/utf8"
"sync"
"github.com/robfig/cron"
cpu "github.com/shirou/gopsutil/cpu"
"fmt"
)
const NumofResource = 4
// 구조체
type HostInfo struct {
Hostid string
}
var c *cron.Cron
var lastCPUTimes []cpu.TimesStat
func main() {
fmt.Println("1.main.go > main() start")
defer l4g.Close()
var err interface{}
lastCPUTimes, err = cpu.Times(false) //nil
fmt.Println("2.main.go > err", err)
fmt.Println("3.main.go > lastCPUTimes", lastCPUTimes)
if err != nil {
l4g.Error(err)
}
}
I know that the main function is executed first.
However, we confirmed that the library called cpu_windows.go is executed first.
Why?
> cpu_windows.go : Times(bool) false
>
> cpu_windows.go : common.ProcGetSystemTimes.Call 1
>
> cpu_windows.go : Times(bool) true
>
> cpu_windows.go : return perCPUTimes()
>
> 1.main.go : main() start
>
> cpu_windows.go : Times(bool) false
>
> cpu_windows.go : common.ProcGetSystemTimes.Call 1
>
> 2.main.go : err <nil>
答案1
得分: 1
根据规范:
> 如果一个包有导入,那么在初始化该包本身之前,导入的包会被初始化。
并且
> 程序的执行从初始化主包开始,然后调用 main 函数。
由此可见,在导入的 cpu
包中的初始化代码会在 main
中的任何代码之前执行。
英文:
The specification says:
> If a package has imports, the imported packages are initialized before initializing the package itself.
and
> Program execution begins by initializing the main package and then invoking the function main.
It follows that the initialization code in the imported cpu
package is executed before any code in main
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论