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两个赋值语句的初始化需要在运行时进行。

最后更新于