Links
Comment on page

6.5 编译日志

Schedule.StaticInit()方法中我们可以看到base.Flag.Percent用来控制是否 dump 动态初始化语句,该 Flag 对应的编译参数是-%. 将如下代码保存至文件main.go 中:
package main
import "unsafe"
// 静态初始化语句
var version = 1.2
var versionAlias = version
var names = []string{"Goalng"}
var nameBytes []byte = []byte("Golang")
var nameSize = unsafe.Sizeof("Golang!") // 此处 unsafe.Sizeof 的代码在编译时执行
// 动态初始化语句
var nextVersion = version + 1
var firstName = names[0]
通过命令编译文件go tool compile -G=3 -%=1 main.go会得到如下结果:
nonstatic [0xc000111d60]
. AS tc(1) # main.go:13
. . NAME-main.nextVersion tc(1) Class:PEXTERN Offset:0 float64 # main.go:13
. . ADD tc(1) float64 # main.go:13 float64
. . . NAME-main.version tc(1) Class:PEXTERN Offset:0 float64 # main.go:7
. . . LITERAL-1 tc(1) float64 # main.go:13
nonstatic [0xc000111e50]
. AS tc(1) # main.go:14
. . NAME-main.firstName tc(1) Class:PEXTERN Offset:0 string # main.go:14
. . INDEX tc(1) string # main.go:14 string
. . . NAME-main.names tc(1) Class:PEXTERN Offset:0 SLICE-[]string # main.go:9
. . . LITERAL-0 tc(1) int # main.go:14
可以看出nextVersionfirstName两个赋值语句的初始化需要在运行时进行。