Si consideri il seguente programma Go:Perché lo stack overflow dipende da come accedere alla matrice in Go?
package main
func main() {
var buffer [100000000]float64
var i int
for i = range buffer {
buffer[i] = float64(i)
}
}
Con "go test1.go correre", funziona. (. A meno che non si dispone di troppo poco RAM)
Ora, espando questo programma banalmente:
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)
}
}
"andare test2.go RUN" rendimenti:
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
Mi sembra che, in test1.go, è stato utilizzato l'heap, mentre in test2.go è stata utilizzata la pila. Perché?