Rozważmy następujący program Go:Dlaczego przepełnienie stosu zależy od sposobu uzyskania dostępu do tablicy w systemie Go?
package main
func main() {
var buffer [100000000]float64
var i int
for i = range buffer {
buffer[i] = float64(i)
}
}
Z "go uruchomić test1.go", to działa. (. Chyba, że masz za mało pamięci RAM)
Teraz rozszerzyć ten program trywialnie:
package main
func main() {
var buffer [100000000]float64
var i int
var value float64
for i, value = range buffer {
value = value
buffer[i] = float64(i)
}
}
"go uruchomić test2.go" Wynik:
runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow
runtime stack:
runtime.throw(0x473350, 0xe)
/usr/local/go/src/runtime/panic.go:527 +0x90
runtime.newstack()
/usr/local/go/src/runtime/stack1.go:794 +0xb17
runtime.morestack()
/usr/local/go/src/runtime/asm_amd64.s:330 +0x7f
goroutine 1 [stack growth]:
main.main()
/home/bronger/src/go-test/test3.go:3 fp=0xc860075e50 sp=0xc860075e48
runtime.main()
/usr/local/go/src/runtime/proc.go:111 +0x2b0 fp=0xc860075ea0 sp=0xc860075e50
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1696 +0x1 fp=0xc860075ea8 sp=0xc860075ea0
exit status 2
Wydaje mi się, że w test1.go, użyto stosu, podczas gdy w test2.go stos był używany. Czemu?