2 回答
TA贡献2041条经验 获得超4个赞
在版本 1 中,您声明了一个[100000000]int64{}由编译器立即分配的文字数组。
第2版,你只声明类型的a作为[100000000]int64。
当您只有一个变量声明时,在编译过程中此时的内容是未知的。在版本 2 中,编译器知道它a是 type [100000000]int64,但直到运行时才会分配内存。
当您使用文字时,确切的内存表示将写入二进制文件。它的工作原理与您声明一个string字面量 vs 一个类型的变量相同string;字符串文字将被写入到位,而变量声明只是一个占位符。
即使当前的编译器(go 1.3)允许a转义到堆,文字数据也应该存在于堆栈帧中。您可以在汇编输出中看到这一点(帧大小为 800000016):
TEXT "".func1+0(SB),$800000016-0
如果您确实需要一个比堆栈中可以容纳的更大的文字,您可以将它放在一个全局变量中。以下执行得很好:
var a = [100000000]int64{1}
func func1() {
var i int64
for i = 0; i < 100000000; i++ {
a[i] = i
}
}
我确实必须在a这里初始化至少一个值,因为如果它等于零值,编译器似乎可以省略这个文字。
TA贡献1821条经验 获得超4个赞
这实际上不是答案,但也许有人会发现这很有用。
在我的情况下,当我尝试使用 json.Marshal 以下结构时会发生这种情况:
type Element struct {
Parent *Element
Child []*Element
}
其中 Parent 指向在 Child 中具有当前元素的元素。
所以我只是将“Parent”标记为json:"-"在编组中被忽略。
- 2 回答
- 0 关注
- 228 浏览
添加回答
举报