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:13nonstatic [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
可以看出
nextVersion
与firstName
两个赋值语句的初始化需要在运行时进行。