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
可以看出nextVersion
与firstName
两个赋值语句的初始化需要在运行时进行。
最后更新于
这有帮助吗?